# Python中缺失值怎么處理
## 1. 缺失值的概念與影響
### 1.1 什么是缺失值
缺失值(Missing Value)是指數據集中某些字段的值出現空缺或未記錄的情況,在Python中通常表示為:
- `NaN`(Not a Number,浮點數缺失)
- `None`(Python對象缺失)
- `NaT`(時間類型缺失)
### 1.2 缺失值的常見來源
1. 數據采集時的設備故障
2. 人為錄入遺漏
3. 數據轉換過程中的錯誤
4. 某些字段不適用于特定記錄
### 1.3 缺失值的影響
- 導致計算異常(如`np.mean`遇到NaN會返回NaN)
- 降低模型訓練效果
- 影響統計分析結果
## 2. 檢測缺失值
### 2.1 基礎檢測方法
```python
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': ['a', None, 'c', 'd'],
'C': [True, False, None, True]
})
# 檢查整個DataFrame
print(df.isnull())
# 統計每列缺失值數量
print(df.isnull().sum())
# 檢查特定列
print(df['A'].isnull())
import matplotlib.pyplot as plt
import seaborn as sns
# 缺失值熱力圖
sns.heatmap(df.isnull(), cbar=False)
plt.show()
# 缺失值條形圖
df.isnull().sum().plot(kind='bar')
plt.show()
# 刪除任何包含NaN的行
df_drop = df.dropna(axis=0)
# 刪除所有值都為NaN的行
df_drop_all = df.dropna(how='all')
# 刪除在特定列有缺失值的行
df_drop_col = df.dropna(subset=['A'])
# 刪除任何包含NaN的列
df_drop_cols = df.dropna(axis=1)
# 用0填充
df_fill_zero = df.fillna(0)
# 用字符串填充
df_fill_str = df.fillna('missing')
# 不同列用不同值填充
df_fill_dict = df.fillna({'A': 0, 'B': 'unknown', 'C': False})
# 用列均值填充
df_fill_mean = df.fillna(df.mean())
# 用列中位數填充
df_fill_median = df.fillna(df.median())
# 用列眾數填充(適用于分類變量)
mode_B = df['B'].mode()[0]
df_fill_mode = df.fillna({'B': mode_B})
# 前向填充(用上一個有效值)
df_ffill = df.fillna(method='ffill')
# 后向填充(用下一個有效值)
df_bfill = df.fillna(method='bfill')
# 線性插值
df_interp = df.interpolate()
# 時間序列插值
df['A'] = df['A'].interpolate(method='time')
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=2)
df_knn = pd.DataFrame(imputer.fit_transform(df.select_dtypes(include=[np.number])),
columns=df.select_dtypes(include=[np.number]).columns)
from sklearn.ensemble import RandomForestRegressor
# 對數值列A進行填充
known = df[df['A'].notnull()]
unknown = df[df['A'].isnull()]
X = known.drop('A', axis=1)
y = known['A']
model = RandomForestRegressor()
model.fit(X, y)
predicted = model.predict(unknown.drop('A', axis=1))
df.loc[df['A'].isnull(), 'A'] = predicted
# 時間序列的前后填充
df['value'] = df['value'].fillna(method='ffill').fillna(method='bfill')
# 時間加權插值
df['value'] = df['value'].interpolate(method='time')
# 添加"未知"類別
df['category'] = df['category'].fillna('Unknown')
# 使用最高頻類別
most_frequent = df['category'].mode()[0]
df['category'] = df['category'].fillna(most_frequent)
# 根據其他列的值來填充
df['income'] = df.apply(
lambda row: row['income'] if not pd.isnull(row['income'])
else row['age'] * 1000,
axis=1
)
盲目刪除:可能導致重要數據丟失
不當填充:用均值填充偏態分布數據
忽略缺失原因:未分析缺失機制
測試集污染:用測試集統計量填充
Python提供了豐富的缺失值處理工具,從簡單的刪除、填充到復雜的機器學習方法。選擇哪種方法取決于: - 數據性質(數值/分類) - 缺失比例 - 后續分析目的 - 計算資源
實際工作中通常需要嘗試多種方法,并通過交叉驗證評估效果。記?。簺]有放之四海而皆準的方法,只有最適合當前數據和問題的解決方案。 “`
注:本文代碼示例需要以下庫: - pandas - numpy - scikit-learn - matplotlib - seaborn
可以通過pip install pandas numpy scikit-learn matplotlib seaborn
安裝這些依賴庫。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。