数据清洗那些坑,我帮你踩过了
总有人说数据处理很难,我倒觉得最难的不是分析,是清洗。拿到手的原始数据,十份里有九份是脏的。这段时间整理了一批真实业务数据,坑踩了不少,记下来给同行参考。
乱码:先问编码,再看内容
别人甩过来的 CSV,Excel 打开好好的,我用脚本一读全是”锟斤拷”。这种十有八九是 GBK 编码,脚本默认当 UTF-8 读。处理前先用 file 命令看看编码,或者直接用 iconv -f GBK -t UTF-8 转一下,世界立刻清净。别问我怎么知道的。
Excel 的日期:一串数字看着像天数
最坑的坑。别人导出的 Excel,日期字段在程序里读出来是 45200 这种数字——Excel 内部把日期存成从 1900 年 1 月 1 日算起的天数。要是没发现,你这批数据的时间线全乱了。导出的时候先转成文本格式,或者用 pandas 读的时候指定 parse_dates,把日期列明确解析出来。
CSV 里的”逗号”和”换行”:split 一下天就塌了
有人喜欢用逗号做分隔,但字段里偏偏又有逗号,还没加引号转义。我一开始图省事直接 split(","),结果一条记录被切成七八段。还有字段里藏换行的,行数直接对不上。现在统一用 Python 的 csv 模块或者 pandas 读,别自己手撸 split。
全角半角:看起来一样,匹配不上
清洗的时候发现,两条记录明明肉眼看着一样,join 就是匹配不上。折腾半天,一个是全角空格,一个是半角空格。还有全角括号、全角逗号这些。处理前先统一:全角转半角、首尾去空格。这一条能救你半天命。
别在 Excel 里开大文件
几万行的数据在 Excel 里还能忍,上百万行直接卡死给你看。Excel 那套逻辑是给人手工看小数据的,不是给程序处理大文件的。数据量大就用命令行或者脚本,awk 一行顶 Excel 半天。
去重别只看一列
很多新手去重就按 ID 去,结果把真正不同的记录删了。去重要结合业务判断用哪几列联合去重。有些看起来重复的其实不重复,比如同一个用户在不同时间留下的记录。去重之前,先把数据 head 出来看几行,别急着写代码。
收个尾
折腾下来最大的感受:数据清洗八成的活儿都在清格式,真正的分析只占两成。别急着上高大上的算法,先把数据头几行看明白,编码、日期、空格、分隔符这些基础坑填了,后面就顺了。工具有的是,耐心和细心才是关键。