【数据清洗缺失值处理】

文章目录


一、什么是缺失值?

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

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

理由:

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

缺点:

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

五、如何选择处理方法?

从以下维度判断:

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

核心原则:

  • 保持数据分布
  • 避免引入偏差
  • 简单方法优先
相关推荐
zhangchaoxies2 小时前
如何在 Go 中安全复制接口指针所指向的值
jvm·数据库·python
曲幽2 小时前
FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上
python·fastapi·web·model·field·pydantic·validator·basemodel
Halo_tjn2 小时前
Java 基于字符串相关知识点
java·开发语言·算法
念越2 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
计算机软件程序设计3 小时前
Python Flask工程目录解读
python·flask·工程目录解读
Ares-Wang3 小时前
Flask》》 Flask-OpenID 认证、 OpenID Connect (OIDC)
后端·python·flask
黎阳之光3 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
m0_734949793 小时前
怎么利用Navicat进行调整备份文件压缩等级_详细配置与操作步骤
jvm·数据库·python
CappuccinoRose4 小时前
回溯法 - 软考备战(四十三)
算法·排列组合·路径·n皇后·子集·解数独·岛屿