处理脏数据是数据清洗的核心任务,脏数据可能包括缺失值、重复值、异常值、格式不一致等问题。以下是一些关键技巧和步骤,帮助系统化处理脏数据:


1. 识别脏数据

  • 数据概览:使用 df.info()、df.describe()、value_counts() 等(Python)或基础统计函数(如SQL的 COUNT、DISTINCT)快速了解数据分布。
  • 可视化检查:通过箱线图、直方图、散点图发现异常值。
  • 规则检测:定义业务规则(如年龄不能为负数,日期格式必须一致)筛选违规数据。

2. 处理缺失值

  • 删除:若缺失比例高且无关紧要,直接删除行/列(dropna())。
  • 填充
  • 数值:均值、中位数、众数(fillna())。
  • 分类数据:单独设为“Unknown”类别。
  • 时间序列:用前后值插补(ffill/bfill)。
  • 标记缺失:添加布尔列标记是否缺失,保留信息供模型学习。

3. 处理重复数据

  • 完全重复:df.drop_duplicates() 删除完全相同的行。
  • 关键字段重复:按业务逻辑去重(如保留最新记录:sort_values().drop_duplicates(subset=['id'], keep='last'))。

4. 处理异常值

  • 分位数法:剔除超出1%/99%分位数的值。
  • 标准差法:删除超出均值±3σ的数据。
  • 业务规则:如订单金额不能为负,温度不能超过物理极限。
  • 转换处理:对偏态数据取对数或分箱(pd.cut)。

5. 格式标准化

  • 统一格式
  • 日期:pd.to_datetime() 转换统一格式。
  • 文本:大小写转换(str.lower())、去除空格(str.strip())。
  • 编码转换:分类变量转为数值标签(LabelEncoder)或独热编码(get_dummies)。
  • 正则表达式:提取或替换复杂文本(如电话号码、邮件地址)。

6. 处理不一致数据

  • 映射表修正:如将“北京”、“北京市”统一为“北京市”。
  • 外部验证:通过API或权威数据库校验(如行政区划代码)。
  • 规则引擎:定义规则自动修正(如“性别”字段只保留“男/女/其他”)。

7. 自动化与工具

  • Python库
  • pandas:基础清洗(dropna, replace, apply)。
  • pyjanitor:链式清洗语法(clean_names()、remove_empty())。
  • dplyr(R语言):类似功能。
  • 开源工具:OpenRefine 提供交互式清洗界面。
  • 数据质量框架:如Great Expectations 定义断言规则。

8. 验证与迭代

  • 抽样检查:随机抽取清洗后的数据人工验证。
  • 监控指标:缺失率、唯一值比例、分布变化等。
  • 文档记录:记录清洗逻辑,便于回溯和复现。

示例代码(Python)

import pandas as pd

# 加载数据
df = pd.read_csv("dirty_data.csv")

# 1. 处理缺失值
df['age'] = df['age'].fillna(df['age'].median())

# 2. 去重
df = df.drop_duplicates(subset=['user_id'], keep='last')

# 3. 修正格式
df['date'] = pd.to_datetime(df['date'], errors='coerce')  # 无效日期转为NaT

# 4. 处理异常值
q_low, q_high = df['price'].quantile([0.01, 0.99])
df = df[(df['price'] >= q_low) & (df['price'] <= q_high)]

# 5. 保存清洗结果
df.to_csv("cleaned_data.csv", index=False)

关键原则

  • 业务优先:清洗逻辑需符合业务场景(如医疗数据与电商数据容忍度不同)。
  • 平衡保留与剔除:避免过度清洗丢失有价值信息。
  • 自动化+人工复核:尤其对关键决策数据。

通过系统化的清洗流程,脏数据可以转化为高质量的分析基础。