Python使用Pandas處理缺失值的技巧分享
一、缺失值的三種形態(tài)
爬蟲數(shù)據(jù)中的缺失值通常以三種形式存在:
- 顯性缺失:直接顯示為
None或NaN(Not a Number) - 隱性缺失:用特殊值代替(如"-"、"N/A"、"0")
- 結(jié)構(gòu)缺失:整行/整列數(shù)據(jù)缺失(如JSON解析失敗導(dǎo)致的空字典)
import pandas as pd
import numpy as np
# 模擬爬蟲數(shù)據(jù)
data = {
'商品名稱': ['iPhone13', '華為Mate50', None, '小米13', 'N/A'],
'價格': [5999, 4999, np.nan, 3999, '-'],
'銷量': [1200, 800, 0, 1500, None],
'庫存': ['有貨', '缺貨', '有貨', '有貨', '']
}
df = pd.DataFrame(data)二、缺失值檢測四步法
1. 快速概覽缺失情況
# 查看每列缺失值數(shù)量 print(df.isnull().sum()) # 查看缺失值比例 print(df.isnull().mean().round(2))
輸出結(jié)果會顯示每列有多少缺失值及其占比,幫助判斷哪些字段需要重點(diǎn)處理。
2. 可視化缺失分布
import missingno as msno msno.matrix(df.sample(5)) # 隨機(jī)展示5行數(shù)據(jù)的缺失矩陣 msno.bar(df) # 柱狀圖展示各列缺失比例
3. 識別隱性缺失
# 自定義隱性缺失值列表
hidden_missing = ['-', 'N/A', '無', '未知', '']
# 檢測包含隱性缺失的列
for col in df.columns:
if df[col].dtype in ['object', 'string']:
missing_count = df[col].isin(hidden_missing).sum()
if missing_count > 0:
print(f"{col}列發(fā)現(xiàn){missing_count}個隱性缺失值")4. 結(jié)構(gòu)缺失檢測
# 檢查是否有整行為空的情況
print("整行為空的記錄數(shù):", df.isnull().all(axis=1).sum())
# 檢查特定列組合缺失模式
print(df[['價格', '銷量']].isnull().sum())三、缺失值處理實(shí)戰(zhàn)方案
方案1:直接刪除(適用于缺失率<30%的列)
# 刪除包含缺失值的行(謹(jǐn)慎使用) df_drop_rows = df.dropna() # 刪除缺失值超過50%的列 threshold = len(df) * 0.5 df_drop_cols = df.dropna(thresh=threshold, axis=1) # 指定列刪除(當(dāng)價格缺失時刪除整行) df_drop_specific = df.dropna(subset=['價格'])
方案2:填充固定值(適用于分類數(shù)據(jù))
# 用"未知"填充商品名稱缺失
df['商品名稱'] = df['商品名稱'].fillna('未知')
# 用0填充銷量缺失(需確認(rèn)業(yè)務(wù)邏輯)
df['銷量'] = df['銷量'].fillna(0)
# 批量處理文本列的隱性缺失
text_cols = ['商品名稱', '庫存']
for col in text_cols:
df[col] = df[col].replace(hidden_missing, '未知')方案3:統(tǒng)計(jì)量填充(適用于數(shù)值數(shù)據(jù))
# 用中位數(shù)填充價格(抗異常值干擾)
median_price = df['價格'].median()
df['價格'] = df['價格'].replace('-', np.nan).fillna(median_price)
# 用均值填充銷量(需數(shù)據(jù)分布均勻)
mean_sales = df['銷量'].mean()
df['銷量'] = df['銷量'].fillna(mean_sales)
# 前向填充(時間序列數(shù)據(jù)適用)
df['價格'] = df['價格'].fillna(method='ffill')方案4:模型預(yù)測填充(適用于關(guān)鍵字段)
from sklearn.ensemble import RandomForestRegressor # 準(zhǔn)備數(shù)據(jù)(示例:用其他特征預(yù)測價格) known = df[df['價格'].notna()] unknown = df[df['價格'].isna()] X_known = known[['銷量', '庫存']] y_known = known['價格'] X_unknown = unknown[['銷量', '庫存']] # 訓(xùn)練模型并預(yù)測 model = RandomForestRegressor(n_estimators=100) model.fit(X_known, y_known) predicted_prices = model.predict(X_unknown) # 填充缺失值 df.loc[df['價格'].isna(), '價格'] = predicted_prices
方案5:插值法(適用于有序數(shù)據(jù))
# 創(chuàng)建帶時間索引的示例數(shù)據(jù)
dates = pd.date_range('2023-01-01', periods=5)
temp_data = {'溫度': [22, np.nan, 25, np.nan, 28]}
temp_df = pd.DataFrame(temp_data, index=dates)
# 線性插值
temp_df['溫度'] = temp_df['溫度'].interpolate()
# 時間加權(quán)插值(更平滑)
temp_df['溫度'] = temp_df['溫度'].interpolate(method='time')四、缺失值處理進(jìn)階技巧
1. 分組填充(不同類別不同策略)
# 按庫存狀態(tài)分組填充價格
def fill_price(group):
if group.name == '有貨':
return group.fillna(group.median())
else:
return group.fillna(0) # 缺貨商品可能標(biāo)0價
df['價格'] = df.groupby('庫存')['價格'].apply(fill_price)2. 多重填充策略組合
# 先填充隱性缺失,再填充顯性缺失
for col in ['價格', '銷量']:
# 處理隱性缺失
if df[col].dtype == 'object':
df[col] = df[col].replace('-', np.nan)
# 根據(jù)缺失率選擇填充方式
missing_rate = df[col].isna().mean()
if missing_rate < 0.1:
df[col] = df[col].fillna(df[col].median())
elif missing_rate < 0.3:
df[col] = df[col].fillna(df[col].mean())
else:
df[col] = df[col].fillna(-1) # 標(biāo)記特殊值3. 缺失值標(biāo)記法(保留信息)
# 創(chuàng)建缺失標(biāo)記列
for col in ['價格', '銷量']:
df[f'{col}_is_missing'] = df[col].isna().astype(int)
# 然后填充缺失值
df['價格'] = df['價格'].fillna(df['價格'].median())五、處理后的數(shù)據(jù)驗(yàn)證
# 驗(yàn)證缺失值是否處理完成
print("剩余缺失值數(shù)量:\n", df.isnull().sum())
# 檢查填充值是否合理
print("價格描述統(tǒng)計(jì):\n", df['價格'].describe())
print("銷量分布:\n", df['銷量'].value_counts())
# 可視化驗(yàn)證
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
df['價格'].plot(kind='hist', title='價格分布')
plt.subplot(1, 2, 2)
df['銷量'].plot(kind='hist', title='銷量分布')
plt.tight_layout()
plt.show()常見問題Q&A
Q1:被網(wǎng)站封IP怎么辦?
A:立即啟用備用代理池,建議使用住宅代理(如站大爺IP代理),配合每請求更換IP策略。更穩(wěn)妥的方式是使用爬蟲框架(如Scrapy)的中間件實(shí)現(xiàn)自動切換。
Q2:如何選擇填充值?
A:根據(jù)數(shù)據(jù)類型和業(yè)務(wù)邏輯決定:
- 數(shù)值型:中位數(shù)(抗異常值)> 均值(數(shù)據(jù)分布均勻時)> 固定值
- 類別型:眾數(shù) > "未知" > 新類別
- 時間序列:插值法 > 前向填充 > 固定值
Q3:缺失值處理會影響數(shù)據(jù)分析結(jié)果嗎?
A:會。不當(dāng)處理可能導(dǎo)致:
- 均值/方差計(jì)算偏差
- 模型過擬合(如用均值填充造成虛假集中趨勢)
- 分類模型準(zhǔn)確率下降(錯誤填充改變數(shù)據(jù)分布)
Q4:什么時候應(yīng)該刪除缺失值?
A:滿足以下條件時考慮刪除:
- 缺失率超過70%的列
- 關(guān)鍵字段缺失的記錄(如訂單ID缺失)
- 缺失機(jī)制完全隨機(jī)(MCAR)且樣本量充足
Q5:如何自動化缺失值處理流程?
A:可創(chuàng)建處理管道:
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
def preprocess_data(df):
numeric_features = ['價格', '銷量']
categorical_features = ['商品名稱', '庫存']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median'))
])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='未知'))
])
# 實(shí)際應(yīng)用中可使用ColumnTransformer組合處理
# 此處僅為示例結(jié)構(gòu)
return processed_df結(jié)語
處理缺失值就像修理一輛二手車:不是簡單更換損壞零件,而是要理解每個缺失背后的原因。有時缺失本身就包含信息(如用戶未填寫收入可能暗示低收入群體),過度填充反而會丟失價值。建議每次處理后都保存處理日志,記錄缺失率、填充策略和驗(yàn)證結(jié)果,為后續(xù)分析提供可追溯的依據(jù)。
以上就是Python使用Pandas處理缺失值的技巧分享的詳細(xì)內(nèi)容,更多關(guān)于Python Pandas處理缺失值的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Python NumPy中矩陣和通用函數(shù)的使用
在NumPy中,矩陣是ndarray的子類,與數(shù)學(xué)概念中的矩陣一樣,NumPy中的矩陣也是二維的,可以使用 mat 、 matrix 以及 bmat 函數(shù)來創(chuàng)建矩陣。本文將詳細(xì)講解NumPy中矩陣和通用函數(shù)的使用,感興趣的可以了解一下2022-06-06
Python實(shí)現(xiàn)抓取城市的PM2.5濃度和排名
本文給大家介紹的是一則使用Python實(shí)現(xiàn)抓取城市的PM2.5數(shù)據(jù)和排名,2015-03-03
python+adb+monkey實(shí)現(xiàn)Rom穩(wěn)定性測試詳解
這篇文章主要介紹了python+adb+monkey實(shí)現(xiàn)Rom穩(wěn)定性測試詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python基于聚類算法實(shí)現(xiàn)密度聚類(DBSCAN)計(jì)算【測試可用】
這篇文章主要介紹了Python基于聚類算法實(shí)現(xiàn)密度聚類(DBSCAN)計(jì)算,結(jié)合實(shí)例形式分析了聚類算法的相關(guān)概念、原理及使用聚類算法進(jìn)行密度聚類計(jì)算的相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
在NumPy中創(chuàng)建空數(shù)組/矩陣的方法
今天小編就為大家分享一篇在NumPy中創(chuàng)建空數(shù)組/矩陣的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
用Python實(shí)現(xiàn)將一張圖片分成9宮格的示例
今天小編就為大家分享一篇用Python實(shí)現(xiàn)將一張圖片分成9宮格的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python將圖片透明背景轉(zhuǎn)為白色背景的兩種方法
這篇文章主要為大家詳細(xì)介紹了python如何使用opencv2和PIL實(shí)現(xiàn)將圖片透明背景轉(zhuǎn)換成白色背景功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-05-05

