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() 确认缺失处理符合预期、类型正确、取值区间合理。
这些操作是处理方式示例,应按列的业务含义选择。时间序列先排序;预测任务避免用未来值回填。填充值、异常阈值等只在训练集拟合,再用于验证集和测试集。清洗后仍允许存在合理的缺失值。
教程
回复
0 条回复