Python 数据清洗怎么做?缺失值、重复值、异常值处理全攻略
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
原则:先观察,再决定,不盲目删改。 清洗前用 df.info()、df.describe()、df.isnull().sum() 摸清数据全貌。
一、缺失值处理
df.isnull().sum() / len(df) # 看每列缺失比例
- 比例很小(<5%):直接删除
df.dropna(subset=["列名"])。 - 数值列:用均值/中位数填充(
df["age"].fillna(df["age"].median()));分布偏态用中位数更稳。 - 类别列:用众数填充
df["city"].fillna(df["city"].mode()[0]),或单独标记为 "unknown"。 - 时间序列:用前向/后向填充
df.fillna(method="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 视为异常)
from scipy import stats
z = np.abs(stats.zscore(df["price"]))
outlier = z > 3
处理方式:业务上确认是错误数据就删除;是真实极端值(如超高收入)可用截尾(Winsorize,把超出分位数的值压到分位数);不能确定就先保留、单独标记,不要在清洗阶段误删真实信息。
四、类型与格式
df["age"] = df["age"].astype(int) # 类型转换
df["date"] = pd.to_datetime(df["date"]) # 日期解析
df["city"].str.strip() # 去空格
最后验证: 清洗后再次 df.info() + df.describe() 确认无缺失、无异常类型、取值区间合理。
回复
0 条回复