文章目录
- 一、什么是缺失值?
- 二、缺失值产生的原因
- 三、缺失值的检测
-
- [1. 判断是否存在缺失值](#1. 判断是否存在缺失值)
- [2. 统计缺失值数量](#2. 统计缺失值数量)
- [3. 查看缺失值比例](#3. 查看缺失值比例)
- 四、缺失值处理方法
-
- [1. 删除缺失值](#1. 删除缺失值)
- [2. 填充缺失值](#2. 填充缺失值)
-
- (1)使用固定值填充
- (2)使用均值填充
- (3)使用中位数填充
- (4)使用众数填充(分类数据)
- [(5)前向填充 / 后向填充](#(5)前向填充 / 后向填充)
- [3. 插值法](#3. 插值法)
- [4. 使用模型预测填充](#4. 使用模型预测填充)
- 五、如何选择处理方法?
一、什么是缺失值?
缺失值是指数据集中某些字段没有记录值,通常表现为:
NaN(Not a Number)None- 空字符串
"" - 特定占位符(如
"?"、"-1")
示例:
python
import pandas as pd
data = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, None, 30],
"salary": [5000, 6000, None]
})
print(data)
输出:
name age salary
0 Alice 25.0 5000.0
1 Bob NaN 6000.0
2 Charlie 30.0 NaN
二、缺失值产生的原因
理解原因有助于选择正确处理策略:
-
数据采集问题
- 用户未填写
- 设备采集失败
-
数据传输或存储问题
- 数据丢失或损坏
-
人为处理
- 故意隐藏敏感信息
-
业务逻辑原因
- 某些字段本身就是"可选"的
三、缺失值的检测
在处理之前,首先要定位缺失值。
1. 判断是否存在缺失值
python
print(data.isnull())
2. 统计缺失值数量
python
print(data.isnull().sum())
3. 查看缺失值比例
python
missing_ratio = data.isnull().sum() / len(data)
print(missing_ratio)
理由:
缺失比例直接影响处理策略,例如缺失率超过 50% 时,通常考虑删除该列。
四、缺失值处理方法
1. 删除缺失值
(1)删除含缺失值的行
python
data_drop_row = data.dropna()
(2)删除含缺失值的列
python
data_drop_col = data.dropna(axis=1)
(3)设置阈值删除
python
data_thresh = data.dropna(thresh=2)
解释:
thresh=2 表示至少保留有2个非空值的行。
适用场景:
- 数据量大
- 缺失比例较小
风险:
- 可能丢失重要信息
2. 填充缺失值
(1)使用固定值填充
python
data_fill = data.fillna(0)
适用于:
- 缺失值有明确含义(如0表示无)
(2)使用均值填充
python
data["age"].fillna(data["age"].mean(), inplace=True)
理由:
- 保持数据分布稳定
- 适用于数值型数据
(3)使用中位数填充
python
data["salary"].fillna(data["salary"].median(), inplace=True)
理由:
- 对异常值不敏感
- 更稳健
(4)使用众数填充(分类数据)
python
data["name"].fillna(data["name"].mode()[0], inplace=True)
(5)前向填充 / 后向填充
python
data.fillna(method='ffill', inplace=True) # 前向填充
data.fillna(method='bfill', inplace=True) # 后向填充
适用:
- 时间序列数据
3. 插值法
python
data["age"] = data["age"].interpolate()
说明:
- 基于已有数据趋势进行填补
- 常用于连续数据
4. 使用模型预测填充
思路:
- 将缺失值作为预测目标
- 使用其他特征训练模型
示例:
python
from sklearn.ensemble import RandomForestRegressor
# 构造训练数据
train_data = data[data["salary"].notnull()]
test_data = data[data["salary"].isnull()]
X_train = train_data[["age"]]
y_train = train_data["salary"]
model = RandomForestRegressor()
model.fit(X_train, y_train)
# 预测缺失值
data.loc[data["salary"].isnull(), "salary"] = model.predict(test_data[["age"]])
理由:
- 能利用数据之间的关系
- 精度通常高于简单填充
缺点:
- 实现复杂
- 计算成本较高
五、如何选择处理方法?
从以下维度判断:
| 场景 | 推荐方法 |
|---|---|
| 缺失比例很低 | 删除 |
| 数值型数据 | 均值/中位数 |
| 分类数据 | 众数 |
| 时间序列 | 前向填充 |
| 数据关联强 | 模型预测 |
| 高精度要求 | 插值/模型 |
核心原则:
- 保持数据分布
- 避免引入偏差
- 简单方法优先