【数据清洗缺失值处理】

文章目录


一、什么是缺失值?

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

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

理由:

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

缺点:

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

五、如何选择处理方法?

从以下维度判断:

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

核心原则:

  • 保持数据分布
  • 避免引入偏差
  • 简单方法优先
相关推荐
海绵宝宝转agent3 分钟前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭10 分钟前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT22 分钟前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071571 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
hetao17338372 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
卷无止境2 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路2 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师2 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师2 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
Zootopia6262 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信