Python數(shù)據(jù)清洗與預(yù)處理: Pandas與NumPy應(yīng)用技巧
一、數(shù)據(jù)清洗基礎(chǔ)與核心挑戰(zhàn)
1.1 數(shù)據(jù)質(zhì)量問題的典型表現(xiàn)
在數(shù)據(jù)分析項目中,約60%的時間消耗在數(shù)據(jù)清洗階段(IBM研究數(shù)據(jù))。常見問題包括:
- 缺失值(Missing Values):數(shù)據(jù)集中的空白或NA記錄
- 異常值(Outliers):超出正常范圍的極端數(shù)值
- 格式錯誤(Format Errors):日期、貨幣等格式不一致
- 重復(fù)記錄(Duplicate Entries):完全相同的重復(fù)數(shù)據(jù)行
# 檢測缺失值示例
import pandas as pd
df = pd.read_csv('sales_data.csv')
print(df.isnull().sum()) # 輸出各列缺失值數(shù)量
1.2 Pandas與NumPy的協(xié)同工作流
Pandas提供DataFrame結(jié)構(gòu)處理表格數(shù)據(jù),NumPy則擅長數(shù)值計算。典型工作流:
原始數(shù)據(jù) → Pandas加載 → 缺失值處理 → 異常值修正 → 數(shù)據(jù)轉(zhuǎn)換 → NumPy矩陣運算 → 輸出清洗結(jié)果
二、Pandas高效清洗實戰(zhàn)
2.1 缺失值處理策略
根據(jù)Kaggle調(diào)查,83%的數(shù)據(jù)分析師采用以下方法處理缺失值:
# 多重填補示例
from sklearn.impute import IterativeImputer
imputer = IterativeImputer(max_iter=10)
df[['price', 'quantity']] = imputer.fit_transform(df[['price', 'quantity']])
| 方法 | 適用場景 | 數(shù)據(jù)保留率 |
|---|---|---|
| 直接刪除 | 缺失率<5% | 低 |
| 均值填補 | 數(shù)值型特征 | 高 |
| 插值法 | 時間序列 | 高 |
2.2 異常值檢測與處理
使用Z-score方法識別異常值:
# Z-score異常檢測
from scipy import stats
z_scores = stats.zscore(df['sales'])
df = df[(z_scores < 3) & (z_scores > -3)]
三、NumPy數(shù)值優(yōu)化技巧
3.1 矩陣運算加速策略
使用NumPy向量化操作比Pandas循環(huán)快10-100倍:
# 向量化計算示例
import numpy as np
data = np.array(df['price'])
discounted = np.where(data > 100, data*0.9, data*0.95)
3.2 內(nèi)存優(yōu)化方法
通過數(shù)據(jù)類型轉(zhuǎn)換減少內(nèi)存占用:
# 內(nèi)存優(yōu)化示例
df['category'] = df['category'].astype('category') # 減少字符串存儲空間
float_array = np.array(df['value'], dtype=np.float32) # 32位浮點數(shù)
四、高級預(yù)處理技術(shù)
4.1 數(shù)據(jù)標(biāo)準(zhǔn)化與歸一化
# Min-Max標(biāo)準(zhǔn)化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['age', 'income']] = scaler.fit_transform(df[['age', 'income']])
4.2 分類特征編碼實踐
處理分類變量的兩種主流方法:
# One-Hot編碼
df_encoded = pd.get_dummies(df, columns=['city'], prefix='city')
# 目標(biāo)編碼(Target Encoding)
from category_encoders import TargetEncoder
encoder = TargetEncoder()
df['city_encoded'] = encoder.fit_transform(df['city'], df['sales'])
五、性能優(yōu)化最佳實踐
5.1 大數(shù)據(jù)集處理策略
使用Dask處理超過內(nèi)存的數(shù)據(jù)集:
# Dask并行處理示例
import dask.dataframe as dd
ddf = dd.read_csv('large_dataset/*.csv')
result = ddf.groupby('category').mean().compute()
5.2 并行計算加速
# 多核并行處理
from joblib import Parallel, delayed
def process_chunk(chunk):
return chunk.apply(complex_calculation)
results = Parallel(n_jobs=4)(delayed(process_chunk)(chunk) for chunk in np.array_split(df, 4))
#Python數(shù)據(jù)清洗 #Pandas技巧 #NumPy應(yīng)用 #數(shù)據(jù)預(yù)處理 #機器學(xué)習(xí)預(yù)處理