处理脏数据是数据清洗的核心任务,脏数据可能包括缺失值、重复值、异常值、格式不一致等问题。以下是一些关键技巧和步骤,帮助系统化处理脏数据:
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)关键原则
- 业务优先:清洗逻辑需符合业务场景(如医疗数据与电商数据容忍度不同)。
- 平衡保留与剔除:避免过度清洗丢失有价值信息。
- 自动化+人工复核:尤其对关键决策数据。
通过系统化的清洗流程,脏数据可以转化为高质量的分析基础。
















