在數據分析的世界裏,數據清洗就像烹飪前的食材處理——如果食材不新鮮(數據有問題),後續的美味佳餚(分析結果)肯定會大打折扣。而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用 NaN 或 None 表示。處理方式有兩種:刪除或填充。
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)
現在“出生日期”列會顯示爲日期格式,年齡是整數,數據類型更規範了。
七、總結:新手數據清洗流程¶
- 導入數據:用
pd.read_csv()讀入數據,或手動創建示例DataFrame; - 初步檢查:
df.head()看數據,df.info()看類型,df.isnull().sum()看缺失; - 處理缺失值:刪除或用均值/中位數填充;
- 處理重複值:用
duplicated()識別,drop_duplicates()刪除; - 處理異常值:用描述統計或邏輯判斷篩選;
- 轉換數據類型:確保數值型、日期型正確。
最重要的小技巧:多動手!把上面的代碼複製到Jupyter Notebook運行,用自己的數據測試,很快就能掌握~ 數據清洗沒有固定公式,多練幾次就會“火眼金睛”識別問題啦!
下一篇預告:如果數據量很大,pandas如何高效清洗?關注我,下期帶你進階數據清洗!