【数据清洗缺失值处理】

文章目录


一、什么是缺失值?

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

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

理由:

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

缺点:

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

五、如何选择处理方法?

从以下维度判断:

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

核心原则:

  • 保持数据分布
  • 避免引入偏差
  • 简单方法优先
相关推荐
小哈里12 分钟前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小葱炖豆腐1 小时前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
小π军1 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司1 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
Ticnix2 小时前
MCP 实战:把工具层从 Agent 里彻底解耦
python·mcp
a187927218312 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记2 小时前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展
Navigator_Z2 小时前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode
XZ-0700012 小时前
week4-1-figure画布
python
wzdark3 小时前
多维数组在算法设计中的存储映射问题4
算法