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

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() 确认无缺失、无异常类型、取值区间合理。

REPLIES

回复

0 条回复
暂无回复。