【数据清洗缺失值处理】

文章目录


一、什么是缺失值?

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

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

理由:

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

缺点:

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

五、如何选择处理方法?

从以下维度判断:

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

核心原则:

  • 保持数据分布
  • 避免引入偏差
  • 简单方法优先
相关推荐
benchmark_cc18 小时前
如何为 QuantDash Python SDK 编写一个最小化的连接验证脚本?
python·数据分析·pandas·量化交易·股票数据·quantdash
一条闲鱼_mytube18 小时前
分布式 ID 生成方案:雪花算法与号段模式
分布式·算法·wpf
程序边界18 小时前
顶刊级论文配图全流程:用 Python 复刻 Nature/Science 风格图表
开发语言·python
Msir_Modern18 小时前
Noita 元胞沙盒笔记
算法·unity·c#·游戏引擎·元胞自动机
BD_Marathon18 小时前
【RAG项目】01、RAG项目案例介绍
python
好焊孙辉18 小时前
螺柱焊机哪家质量好
python·fpga开发
Chensf202119 小时前
杉数求解器COPT安装及在python中使用
数学建模
STLearner19 小时前
KDD 2026 | (2月轮)时空数据(Spatial-Temporal)论文总结时空【下】(人群移动,城市科学(资源调度,)
大数据·人工智能·python·深度学习·机器学习·语言模型·数据挖掘
云和数据.ChenGuang19 小时前
python sorted函数详细剖析
开发语言·人工智能·windows·python·1024程序员节
木井巳19 小时前
【动态规划: 路径问题】不同路径
java·算法·leetcode·动态规划