脏数据清洗需组合策略而非一键函数:用dropna()、str.replace()、astype()和布尔索引处理空值、HTML标签、类型转换及重复数据,关键在预处理、分步验证与人工判断。

脏数据清洗不是靠“一键函数”解决的,而是靠组合策略+针对性判断。Pandas 本身没有 clean_data() 这种万能函数,但用好 dropna()、str.replace()、astype() 和布尔索引,90% 的爬虫脏数据(空值、乱码、重复、格式混杂)能在 10 分钟内理出可用结构。
空值和空白字符串怎么统一处理?
爬虫常把缺失字段填成空字符串 ""、" " 或 None,而 dropna() 默认只删 NaN,对空串完全无视——这是最常踩的坑。
- 先用
df.replace(r'^\s*$', pd.NA, regex=True)把所有纯空白(含空格、制表符、换行)转为pd.NA - 再统一用
df.dropna(subset=["title", "price"], how="any")按关键列删行(别盲目how="all",容易留一堆空行) - 注意:如果某列是数值型但含空串,
astype(float)会直接报错ValueError: could not convert string to float,必须先转NA
字符串里混着 HTML 标签、换行符、不可见字符怎么办?
爬虫抓到的文本经常带 <br>、\n、\u200b(零宽空格)等,用 str.strip() 是不够的,得先清洗再规整。
- 用
df["desc"].str.replace(r'<[^>]+>', '', regex=True)去 HTML 标签(别用正则<.*>,会跨标签误删) - 用
df["desc"].str.replace(r'[\r\n\t\u200b\u200c\u200d]+', ' ', regex=True)合并所有控制字符为单空格 - 最后补一句
.str.strip().replace('', pd.NA),防止只剩空格还留在字段里
价格、日期这类字段怎么安全转类型?
astype(int) 或 pd.to_datetime() 遇到脏值(如 "¥1,299.00"、"2024/03/xx")会直接崩,必须预处理。
立即学习“Python免费学习笔记(深入)”;
- 价格字段:先
df["price"].str.replace(r'[^\d.]', '', regex=True)只留数字和小数点,再pd.to_numeric(..., errors="coerce")——errors="coerce"是关键,它把转不出的全变NaN,而不是中断 - 日期字段:优先用
pd.to_datetime(df["date"], format="mixed", errors="coerce")(Pandas 2.0+ 支持format="mixed"),比硬写%Y-%m-%d更鲁棒;旧版本就分两步:先str.extract(r'(\d{4}-\d{2}-\d{2})')提取标准格式,再转 - 别在转类型后立刻
dropna()——先看df["price"].isna().sum(),确认异常比例,再决定是修复还是剔除
重复数据怎么判重才不丢信息?
单纯用 df.duplicated() 很危险:标题相同但价格不同(促销价 vs 日常价)、同一商品多条抓取(不同时间戳)可能被误删。
- 明确去重维度:
df.drop_duplicates(subset=["product_id"], keep="last")比subset=["title"]更可靠 - 如果没唯一 ID,用组合键:
subset=["title", "brand", "price"],但要先确保这三列已清洗干净(否则"Apple" vs "apple "算不同) - 用
df.duplicated(keep=False)先标记所有重复行,人工抽样检查几组,再执行删除——批量操作前留个验证环节,省得返工
真正耗时的从来不是写代码,而是判断哪一列该留、哪一列该砍、异常值是噪音还是信号。清洗脚本跑完后,务必用 df.info() 和 df.sample(5).to_dict("records") 快速扫一眼真实数据长什么样,而不是只信 shape 数字。


















