【数据清洗缺失值处理】

文章目录


一、什么是缺失值?

缺失值是指数据集中某些字段没有记录值,通常表现为:

  • 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. 数据采集问题

    • 用户未填写
    • 设备采集失败
  2. 数据传输或存储问题

    • 数据丢失或损坏
  3. 人为处理

    • 故意隐藏敏感信息
  4. 业务逻辑原因

    • 某些字段本身就是"可选"的

三、缺失值的检测

在处理之前,首先要定位缺失值。

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"]])

理由:

  • 能利用数据之间的关系
  • 精度通常高于简单填充

缺点:

  • 实现复杂
  • 计算成本较高

五、如何选择处理方法?

从以下维度判断:

场景 推荐方法
缺失比例很低 删除
数值型数据 均值/中位数
分类数据 众数
时间序列 前向填充
数据关联强 模型预测
高精度要求 插值/模型

核心原则:

  • 保持数据分布
  • 避免引入偏差
  • 简单方法优先
相关推荐
时光Autistic2 分钟前
【安装教程】AI标注工具X-AnyLabeling安装配置
人工智能·python
knight_9___6 分钟前
大模型project面试7
人工智能·python·算法·面试·大模型·agent
yuhuofei202111 分钟前
【Python入门】Python与PyCharm的安装
开发语言·python·pycharm
吴声子夜歌15 分钟前
Java——类加载机制
java·开发语言·python
qxwlcsdn1 小时前
mysql在事务中执行DDL的后果_MySQL 8.0之前的限制
jvm·数据库·python
NashSKY1 小时前
EM 算法完整推导与本质剖析
算法·机器学习·概率论
灰色人生qwer1 小时前
Python 规则:带默认值的参数必须放在不带默认值的后面
linux·windows·python
foundbug9991 小时前
MATLAB实现:基于图像对比度和波段相关性的高光谱波段选择算法
开发语言·算法·matlab
嘿嘿嘿x31 小时前
Linux-实践
linux·运维·算法
2401_884454151 小时前
如何防止SQL触发器导致性能下降_通过精简触发器逻辑
jvm·数据库·python