如何使用 Pandas 進行數據清洗?如何保證數據清洗的效果?
前言
數據清洗是數據分析和機器學習項目中的關鍵步驟,它涉及處理缺失值、異常值、重復記錄、不一致的數據等。Pandas 提供了豐富的功能來幫助你進行數據清洗。
如何使用 Pandas 進行數據清洗
1. 導入必要的庫
import pandas as pd
import numpy as np
2. 讀取數據
假設你有一個 CSV 文件 data.csv,其中包含一些特征和目標變量。
# 讀取數據
df = pd.read_csv('data.csv')
print(df.head())
3. 數據探索
了解數據的基本信息,包括缺失值、數據類型等。
# 查看基本信息
print(df.info())
# 查看描述性統計信息
print(df.describe())
# 檢查缺失值
print(df.isnull().sum())
4. 處理缺失值
刪除含有缺失值的行或列
# 刪除含有缺失值的行
df = df.dropna()
# 刪除含有缺失值的列
df = df.dropna(axis=1)
填充缺失值
# 用均值填充數值列的缺失值
df['Age'] = df['Age'].fillna(df['Age'].mean())
# 用眾數填充分類列的缺失值
df['Gender'] = df['Gender'].fillna(df['Gender'].mode()[0])
# 用特定值填充
df['Income'] = df['Income'].fillna(0)
# 使用前一個值填充
df['Salary'] = df['Salary'].fillna(method='ffill')
# 使用后一個值填充
df['Salary'] = df['Salary'].fillna(method='bfill')
# 使用插值方法填充
df['Temperature'] = df['Temperature'].interpolate()
5. 處理異常值
條件篩選
# 移除年齡大于100歲的記錄
df = df[df['Age'] <= 100]
使用 Z-score 方法
from scipy import stats
# 計算 Z-score
z_scores = np.abs(stats.zscore(df.select_dtypes(include=[np.number])))
# 移除 Z-score 大于 3 的記錄
df = df[(z_scores < 3).all(axis=1)]
使用 IQR 方法
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
# 移除 IQR 范圍外的記錄
df = df[~((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).any(axis=1)]
6. 處理重復記錄
# 檢查并刪除重復記錄
df = df.drop_duplicates()
7. 數據類型轉換
確保每個列的數據類型正確。
# 將字符串轉換為日期
df['Date'] = pd.to_datetime(df['Date'])
# 將對象類型轉換為數值類型
df['Age'] = pd.to_numeric(df['Age'], errors='coerce')
# 將數值類型轉換為類別類型
df['Category'] = df['Category'].astype('category')
8. 處理不一致的數據
確保數據的一致性,例如統一文本格式。
統一文本格式
# 將所有文本轉換為小寫
df['Name'] = df['Name'].str.lower()
# 去除空格
df['Name'] = df['Name'].str.strip()
替換特定值
# 替換特定值
df['City'] = df['City'].replace({'New York City': 'New York', 'LA': 'Los Angeles'})
9. 處理特殊字符
去除不必要的特殊字符。
# 去除特殊字符
df['Comment'] = df['Comment'].str.replace('[^\w\s]', '', regex=True)
10. 處理時間序列數據
處理時間序列數據,如提取年份、月份、日等。
# 提取年份、月份、日
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
11. 保存清洗后的數據
將清洗后的數據保存到新的文件中。
# 保存清洗后的數據
df.to_csv('cleaned_data.csv', index=False)
如何保證數據清洗的效果?
1. 定義清晰的數據質量標準
在開始數據清洗之前,明確你的數據質量標準。這包括:
數據的完整性:確保所有必要的字段都已填寫。
數據的一致性:確保數據在不同記錄之間是一致的。
數據的準確性:確保數據反映了真實情況。
數據的有效性:確保數據符合預期的格式和范圍。
2. 進行徹底的數據探索
在清洗數據之前,進行徹底的數據探索以了解數據的基本情況。使用 Pandas 和其他可視化工具來檢查數據的分布、缺失值、異常值等。
# 查看基本信息
print(df.info())
# 查看描述性統計信息
print(df.describe())
# 檢查缺失值
print(df.isnull().sum())
# 可視化數據分布
import matplotlib.pyplot as plt
df['Age'].hist(bins=20)
plt.show()
3. 記錄每一步操作
記錄你在數據清洗過程中所做的每一步操作。這有助于你跟蹤和驗證每個步驟的效果,并在需要時回溯或調整。
# 記錄每一步操作
with open('data_cleaning_log.txt', 'w') as f:
f.write("Data Cleaning Log:\n")
f.write(f"Initial shape: {df.shape}\n")
# 示例:處理缺失值
df = df.dropna()
f.write(f"After dropping missing values: {df.shape}\n")
# 示例:處理異常值
df = df[df['Age'] <= 100]
f.write(f"After removing outliers: {df.shape}\n")
# 其他步驟...
4. 分階段進行數據清洗
將數據清洗過程分為多個階段,逐步進行并驗證每個階段的效果。這樣可以更容易地發現和解決問題。
# 第一階段:處理缺失值
df = df.dropna()
# 驗證結果
print(df.isnull().sum())
# 第二階段:處理異常值
df = df[df['Age'] <= 100]
# 驗證結果
print(df['Age'].describe())
5. 使用斷言和測試
編寫斷言和測試來驗證數據清洗的結果是否符合預期。這可以通過簡單的條件語句或更復雜的單元測試來實現。
# 斷言
assert df.isnull().sum().sum() == 0, "There are still missing values in the dataset"
assert (df['Age'] > 100).sum() == 0, "There are still age values greater than 100"
# 單元測試
import unittest
class TestDataCleaning(unittest.TestCase):
def test_missing_values(self):
self.assertEqual(df.isnull().sum().sum(), 0)
def test_outliers(self):
self.assertEqual((df['Age'] > 100).sum(), 0)
if __name__ == '__main__':
unittest.main(argv=['first-arg-is-ignored'], exit=False)
6. 定期復查數據
即使數據清洗完成后,也要定期復查數據,確保沒有新的問題出現。特別是在數據源發生變化或有新數據加入時。
# 定期復查數據
def check_data_quality(df):
print("Checking data quality...")
print("Missing values:", df.isnull().sum())
print("Outliers in Age:", (df['Age'] > 100).sum())
check_data_quality(df)
7. 使用版本控制
使用版本控制系統(如 Git)來管理數據和代碼。這樣可以在出現問題時輕松回滾到之前的版本。
# 初始化 Git 倉庫
git init
# 添加文件
git add data_cleaning_script.py
git add data_cleaning_log.txt
# 提交更改
git commit -m "Initial data cleaning script and log"
8. 與團隊成員溝通
如果你在一個團隊中工作,確保與團隊成員溝通數據清洗的過程和結果。共享文檔、日志和測試結果,以便其他人可以理解和驗證你的工作。
9. 使用自動化工具
考慮使用自動化工具和框架來簡化數據清洗過程。例如,使用 Apache Airflow 或 Prefect 來自動化數據管道,確保數據清洗步驟的一致性和可重復性。
10. 監控數據質量
建立數據質量監控系統,定期檢查數據的質量指標。這可以通過設置報警或報告來實現,以便及時發現和解決問題。