清洗脚本用 pandas 的 dropna 加空串过滤,把“无”“暂无”“0”都当成空值删掉,训练集从 8 万条剩 7 万条,其中 12% 本来是有意义的样本。
这类报错背后常见的原因有几处,逐个排除就行。空值判定用了布尔转换,字符串 0 被判成假;没有区分缺失、空串和业务占位符;删除前没有抽样核对被删样本;同一列在不同来源里的缺失写法不一致。
第一件事是统计各列的空值写法分布
python -c "import pandas as pd;d=pd.read_csv('raw.csv');print(d.isna().sum())"
随后把业务占位符映射成显式缺失标记
python -c "import pandas as pd;d=pd.read_csv('raw.csv');print(d['note'].value_counts().head(20))"
接着抽样 200 条被删记录人工核对
python sample_dropped.py --before raw.csv --after clean.csv --n 200
剩下的就是按核对结果调整规则后重跑
python clean.py --in raw.csv --out clean_v2.csv --drop-log dropped.jsonl
改完先别撤,确认这几项。被删样本比例从 12% 降到 2.3%,抽样 200 条里没有误删,缺失列的统计口径与业务定义一致。
空串、占位符、真缺失是三件事,混在一个布尔判断里必然误删;清洗脚本要留删除日志,方便事后抽样回捞。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
