DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

Python AI 实战(09/20):Python 数据清洗怎么做?缺失值、重复值、异常值处理全攻略

阿青 · 社区话题账号 · · 3 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

Python AI 实战问答速查手册 · 第 09/20 问

所属板块:数据处理

原则:先观察,再决定,不盲目删改。 清洗前用 df.info()df.describe()df.isnull().sum() 摸清数据全貌。

一、缺失值处理

df.isnull().sum() / len(df)          # 看每列缺失比例
  • 缺失较少:先评估缺失原因和删除是否产生偏差,确实可删除时使用 df.dropna(subset=["列名"])

  • 数值列:用均值/中位数填充(df["age"].fillna(df["age"].median()));分布偏态用中位数更稳。

  • 类别列:用众数填充 df["city"].fillna(df["city"].mode().iloc[0])(须先确认 mode() 非空),或单独标记为 "unknown"。

  • 时间序列:在业务允许时用前向填充 df.ffill()(缺失值用前一条的值)。

  • 重要字段缺失多:考虑用其他特征预测填充(回归/插值),或干脆剔除该列。

二、重复值处理

df.duplicated().sum()  # 重复行数
df.drop_duplicates(inplace=True)     # 删除完全重复的行
df.drop_duplicates(subset=["id"])    # 按某列去重(如同一用户只留一条)

三、异常值处理 先用箱线图/散点图看分布,再定量判断:

# 方法 1:IQR 法(箱线图原理)
Q1, Q3 = df["price"].quantile([0.25, 0.75])
IQR = Q3 - Q1
outlier = (df["price"] < Q1 - 1.5 * IQR) | (df["price"] > Q3 + 1.5 * IQR)

# 方法 2:Z-score 法(|z| > 3 视为异常)
import numpy as np
from scipy import stats
z = np.abs(stats.zscore(df["price"]))
outlier = z > 3

处理方式:业务上确认是错误数据就删除;是真实极端值(如超高收入)可用截尾(Winsorize,把超出分位数的值压到分位数);不能确定就先保留、单独标记,不要在清洗阶段误删真实信息。

四、类型与格式

df["age"] = pd.to_numeric(df["age"], errors="coerce").astype("Int64")  # 类型转换
df["date"] = pd.to_datetime(df["date"], errors="coerce")           # 日期解析
df["city"] = df["city"].str.strip()  # 去空格

最后验证: 清洗后再次 df.info() + df.describe() 确认缺失处理符合预期、类型正确、取值区间合理。

这些操作是处理方式示例,应按列的业务含义选择。时间序列先排序;预测任务避免用未来值回填。填充值、异常阈值等只在训练集拟合,再用于验证集和测试集。清洗后仍允许存在合理的缺失值。

教程
REPLIES

回复

0 条回复
暂无回复。