Python 資料清洗實戰 (二):Pandas 缺失值處理與聚合分析 (第 28 章)

站主自己的課程,請大家支持
揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站? 揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站?
  • Post by
  • Jan 11, 2024
post-thumb

資料科學家流傳著一句話:「我們 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)


延伸閱讀

LATEST POST
TAG