
資料科學家流傳著一句話:「我們 80% 的時間在清洗資料,剩下 20% 的時間在抱怨資料太髒。」
在進行任何機器學習或統計分析前,清洗資料 (Data Cleaning) 是絕對必要的步驟。
1. 處理缺失值 (Missing Data)
在 Pandas 中,缺失值通常顯示為 NaN (Not a Number)。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8],
'C': ['foo', 'bar', 'baz', 'qux']
})
# 1. 檢查缺失值
print(df.isnull().sum())
# A 1
# B 2
# C 0
策略一:刪除 (Drop)
如果資料量夠多,或者缺失值太多無法修補,可以直接丟掉。
# 刪除任何包含 NaN 的列 (Row)
df_dropped = df.dropna()
# 刪除任何包含 NaN 的欄 (Column)
df_dropped_col = df.dropna(axis=1)
策略二:填補 (Fill/Imputation)
更常見的做法是用「平均值」、「中位數」或「特定值」來填補。
# 用 0 填補所有 NaN
df_filled = df.fillna(0)
# 用 A 欄的平均值填補 A 欄的 NaN
df['A'] = df['A'].fillna(df['A'].mean())
2. 處理重複值 (Duplicates)
# 檢查是否有重複列
print(df.duplicated())
# 刪除重複列 (保留第一筆)
df = df.drop_duplicates()
3. 資料分組與聚合 (GroupBy)
這是 Pandas 最強大的功能之一,概念源自 SQL 的 GROUP BY 或 Excel 的樞紐分析表。
假設我們有銷售資料:
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing'],
'Sales': [1000, 500, 1200, 300]
}
df = pd.DataFrame(data)
# 按類別分組,並計算總銷售額
grouped = df.groupby('Category')['Sales'].sum()
print(grouped)
# Category
# Clothing 800
# Electronics 2200
# Name: Sales, dtype: int64
常見的聚合函數:sum(), mean(), max(), min(), count().
你也可以同時計算多種統計量:
df.groupby('Category')['Sales'].agg(['sum', 'mean', 'count'])
4. 應用函數 (Apply)
當內建函數不夠用時,我們可以用 apply() 將自訂函數應用到每一列或每一欄。
def tax_calculation(sales):
return sales * 1.05 # 5% 稅
# 將函數應用到 Sales 欄的每一個元素
df['Sales_with_Tax'] = df['Sales'].apply(tax_calculation)
# 或者用 lambda
df['Sales_with_Tax'] = df['Sales'].apply(lambda x: x * 1.05)
5. 總結
掌握了 缺失值處理 (fillna, dropna) 與 分組聚合 (groupby),你已經能處理 90% 的資料分析任務了。
乾淨的資料是好模型的前提。切記:Garbage In, Garbage Out (垃圾進,垃圾出)。
下一章,我們將學習如何將這些枯燥的數字,轉化為一看就懂的精美圖表——資料視覺化 (Matplotlib & Seaborn)!
延伸閱讀: