在數據分析的世界裏,數據清洗就像烹飪前的食材處理——如果食材不新鮮(數據有問題),後續的美味佳餚(分析結果)肯定會大打折扣。而pandas作爲Python中最強大的數據處理庫,簡直是數據清洗的“瑞士軍刀”,能幫我們高效搞定各種數據問題。本文就用最簡單的方式,帶新手一步步掌握數據清洗的核心技巧,讓你從此告別“髒數據”困擾!

一、安裝與準備:先讓工具就位

首先,確保你的電腦裏已經安裝了pandas(如果沒安裝,打開命令行輸入 pip install pandas 即可)。然後,在Python腳本或Jupyter Notebook中導入pandas庫:

import pandas as pd  # 約定俗成用pd作爲別名

二、數據導入:從“源頭”看數據

數據清洗的第一步是把數據導入到pandas中。最常見的是導入CSV文件,用 pd.read_csv() 就能搞定:

# 假設你有一個名爲"sales_data.csv"的文件,直接讀取
df = pd.read_csv("sales_data.csv")  

# 但如果沒有現成文件,也可以手動創建一個示例DataFrame(方便新手測試)
data = {
    "姓名": ["小明", "小紅", "小剛", "小明", "小芳", "小麗", "小強"],
    "年齡": [25, None, 30, 25, 22, 28, 29],  # None表示缺失值
    "出生日期": ["1998-01-15", "1999-03-20", "1995-05-10", "1998-01-15", "2000-08-22", "2000-11-05", "1995-12-18"],
    "收入": [8000, None, 12000, 8000, 5000, None, 15000]  # 收入有缺失值
}
df = pd.DataFrame(data)

小提示:導入後用 df.head() 快速查看前幾行數據,用 df.info() 查看數據類型和缺失值情況:

print("數據前5行:")
print(df.head())

print("\n數據基本信息:")
print(df.info())

運行後你會看到數據的大致樣子(包含缺失值、重複行、錯誤數據類型等),這是後續清洗的“靶子”。

三、清洗第一步:處理缺失值(數據“空”了怎麼辦?)

缺失值是數據清洗中最常見的問題,pandas用 NaNNone 表示。處理方式有兩種:刪除填充

1. 識別缺失值

df.isnull() 查看哪些位置是空值,df.isnull().sum() 統計每列缺失值數量:

print("各列缺失值數量:")
print(df.isnull().sum())

輸出會顯示:年齡列1個缺失值,收入列1個缺失值。

2. 刪除缺失值(簡單粗暴但慎用)

如果缺失值很少,且不影響整體數據,可以用 dropna() 刪除含缺失值的行或列:

# 刪除所有包含缺失值的行(默認axis=0,即行)
df_drop = df.dropna()  

# 如果想刪除列(比如某列全是缺失值),用axis=1
# df_drop = df.dropna(axis=1)  

print("刪除缺失值後的行數:", df_drop.shape[0])  # 原來7行,現在應該是6行(小明那行重複了?哦對,後面處理重複值)

3. 填充缺失值(更常用的方法)

根據業務邏輯填充缺失值,比如用均值、中位數,或直接填“未知”:

# 填充數值列(年齡和收入)用均值
age_mean = df["年齡"].mean()  # 計算年齡均值(25+30+25+22+28+29=159,6個有效數據,159/6=26.5)
df["年齡"] = df["年齡"].fillna(age_mean)

# 收入列用中位數(因爲收入可能有異常值,均值容易被拉偏)
income_median = df["收入"].median()  # 收入有效數據:8000,12000,8000,5000,15000 → 中位數是8000
df["收入"] = df["收入"].fillna(income_median)

print("填充後的年齡和收入:")
print(df[["年齡", "收入"]])

小提示:如果某列有固定規則(比如“性別”列缺失值填“未知”),可以直接用 df["性別"] = "未知" 填充。

四、清洗第二步:處理重複值(數據“重複”了怎麼辦?)

重複行會讓分析結果失真,比如小明的收入被統計了兩次。pandas用 duplicated() 識別重複行,drop_duplicates() 刪除重複行。

# 識別重複行(默認所有列都相同纔算重複)
print("是否有重複行:", df.duplicated().any())  # 輸出True,因爲小明的兩行數據完全重複

# 刪除重複行(保留第一行,默認keep='first')
df_clean = df.drop_duplicates()  

print("刪除重複行後的行數:", df_clean.shape[0])  # 原來7行→現在6行(小明重複的那行被刪了)

五、清洗第三步:處理異常值(數據“出格”了怎麼辦?)

異常值是指明顯不符合邏輯的數據(比如年齡200歲、收入1000000元)。先通過描述性統計發現異常,再處理。

1. 用描述統計找異常

df.describe() 看數值列的統計信息,比如收入列的最大值、最小值:

print("數值列統計信息:")
print(df_clean.describe())

輸出中如果發現收入列有異常大的值(比如15000可能正常,但如果有150000就明顯異常),可以用邏輯篩選刪除:

# 假設收入超過20000視爲異常(根據業務判斷)
df_clean = df_clean[df_clean["收入"] <= 20000]  # 小強的15000沒問題,所以保留

進階方法:如果數值範圍不明確,也可以用箱線圖(df_clean.boxplot(column='收入'))查看異常值,但需要matplotlib支持,新手可以先簡單用邏輯篩選。

六、清洗第四步:統一數據類型(格式“亂”了怎麼辦?)

數據類型錯誤會導致分析出錯(比如日期列是字符串,無法排序)。用 astype()pd.to_datetime() 轉換類型:

# 1. 轉換出生日期爲datetime類型(方便後續提取年份、月份)
df_clean["出生日期"] = pd.to_datetime(df_clean["出生日期"])

# 2. 轉換年齡爲整數(如果是浮點數12.0,轉成12)
df_clean["年齡"] = df_clean["年齡"].astype(int)

print("轉換後的數據類型:")
print(df_clean.dtypes)

現在“出生日期”列會顯示爲日期格式,年齡是整數,數據類型更規範了。

七、總結:新手數據清洗流程

  1. 導入數據:用 pd.read_csv() 讀入數據,或手動創建示例DataFrame;
  2. 初步檢查df.head() 看數據,df.info() 看類型,df.isnull().sum() 看缺失;
  3. 處理缺失值:刪除或用均值/中位數填充;
  4. 處理重複值:用 duplicated() 識別,drop_duplicates() 刪除;
  5. 處理異常值:用描述統計或邏輯判斷篩選;
  6. 轉換數據類型:確保數值型、日期型正確。

最重要的小技巧:多動手!把上面的代碼複製到Jupyter Notebook運行,用自己的數據測試,很快就能掌握~ 數據清洗沒有固定公式,多練幾次就會“火眼金睛”識別問題啦!

下一篇預告:如果數據量很大,pandas如何高效清洗?關注我,下期帶你進階數據清洗!

小夜