建立穩健的 ETL 管道:使用 Pandas 的資料清理最佳實務
目錄
為什麼資料清理在 ETL 管道中很重要
在現代企業中,資料驅動決策、產品開發和自動化流程。然而,原始資料通常是凌亂的:缺失欄位、格式不一致、錯誤數值或重複資料。ETL(Extract, Transform, Load)管道用於將資料整理為分析或存儲的結構化形式。在 ETL 流程中,資料清理階段尤為關鍵。如果錯誤的資料進入下游系統,可能導致錯誤的儀表板、失效的機器學習模型以及錯誤的策略決策。
常見的資料品質問題
在應用最佳實務之前,了解資料工程師和分析師常遇到的問題很重要:
- 缺失值:因感測器失效、表單不完整或人為錯誤而導致資料缺口。
- 重複資料:系統整合或錯誤的 join 導致資料重複。
- 格式不一致:不同日期格式、文字大小寫或單位不一致。
- 資料型別錯誤:數字存為字串或編碼不明確。
- 異常值:極端值可能表示測量錯誤或異常事件。
- 完整性問題:違反商業規則或約束,例如負數年齡或不可能的時間戳記。
處理缺失值
缺失值在真實資料中是不可避免的。Pandas 提供多種策略來處理:
import pandas as pd
# 範例資料集
data = {
'customer_id': [101, 102, 103, 104],
'age': [25, None, 35, None],
'income': [50000, 60000, None, 45000]
}
df = pd.DataFrame(data)
# 刪除有缺失值的列
df_drop = df.dropna()
# 用常數填補缺失值
df_fill_constant = df.fillna(0)
# 用欄位平均值填補缺失值
df_fill_mean = df.fillna(df.mean(numeric_only=True))
選擇合適的方法取決於情境。刪除資料可能導致大量資訊流失;以平均值、中位數或眾數填補是一種折衷方法。在進階場景中,也可使用預測模型估算缺失值。
移除重複資料
重複資料會增加資料集大小並扭曲分析結果。Pandas 提供簡單的去重方法:
# 移除所有欄位重複的列
df_unique = df.drop_duplicates()
# 根據特定欄位去重
df_unique_col = df.drop_duplicates(subset=['customer_id'])
定義哪些欄位構成唯一記錄非常重要。例如,交易可能共享相同的客戶 ID,但時間戳記不同。
確保正確的資料型別
資料型別錯誤會導致計算錯誤或處理失敗。例如,日期存為字串:
# 將字串轉為 datetime
df['purchase_date'] = pd.to_datetime(df['purchase_date'])
# 將字串轉為數值
df['age'] = pd.to_numeric(df['age'], errors='coerce')
正確的資料型別確保下游聚合、連接或機器學習流程的兼容性。
資料標準化與正規化
標準化確保類似資料遵循一致格式。例如,電話號碼、國家代碼及分類資料常有變化:
# 文字小寫化
df['city'] = df['city'].str.lower()
# 去除空白
df['city'] = df['city'].str.strip()
對數值資料而言,為機器學習模型做正規化或縮放可確保變數貢獻均衡。
管理異常值
異常值會扭曲統計摘要與預測模型,需用統計或領域知識識別:
import numpy as np
from scipy import stats
# 使用 z-score 識別異常值
z_scores = np.abs(stats.zscore(df['income'].dropna()))
outliers = df[z_scores > 3]
根據業務規則,異常值可被修正、刪除或標記以供進一步檢查。
效能與可擴展性考量
隨著資料量增長,Pandas 操作可能佔用大量記憶體。最佳做法包括:
- 使用
chunksize分塊讀取資料。 - 使用向量化操作取代迴圈。
- 透過設定適當資料型別減少記憶體佔用。
- 當資料超過單機容量時,可使用 Dask 或 PySpark 進行分散式處理。
ETL 管道中的資料清理自動化
手動清理無法維持生產環境的一致性。自動化確保流程可重複,並可將清理功能模組化:
def clean_dataset(df):
df = df.drop_duplicates()
df = df.fillna(df.mean(numeric_only=True))
df['city'] = df['city'].str.lower().str.strip()
return df
# 應用清理函式
cleaned_df = clean_dataset(df)
將轉換封裝成函式或類別,可建立可重用的清理模組,整合進 ETL 流程。
驗證與資料品質保證
清理後應搭配驗證,確保符合業務規則:
# 範例驗證:確保年齡合理
assert df['age'].between(0, 120).all(), "偵測到不合法的年齡!"
Pandera 與 Pydantic 等工具可強制資料模式驗證,維持高資料品質。
案例研究:銷售資料清理
假設零售資料集包含客戶資訊與交易歷史,但存在缺失值、格式不一致及重複資料。應用 Pandas 清理:
- 使用中位數填補缺失收入。
- 客戶名稱與城市小寫化標準化。
- 非法年齡設為
NaN並填補。 - 根據交易 ID 移除重複交易。
清理後資料可用於下游分析,實現準確的客戶分群與銷售預測。
最佳實務總結
建立穩健的 Pandas ETL 管道,請遵循以下最佳實務:
- 事先定義清楚的資料品質標準。
- 依情境處理缺失值(刪除、填補或模型估算)。
- 根據業務鍵值謹慎去除重複資料。
- 確保資料型別正確且格式一致。
- 標準化及正規化資料以確保可比較性。
- 根據業務規則識別與管理異常值。
- 以分塊、向量化及記憶體管理優化效能。
- 自動化清理流程並整合至 ETL 管道。
- 使用驗證規則及 schema 工具檢查清理後資料








