简单归纳,数据清洗就分为四步:
拆 -> 丢 -> 填 -> 格式化
1、所谓拆,就是将信息成分复杂的字段进行拆分,如数据形如"3室2卫", 其杂糅了两个数字信息,可以拆分成两个单独的字段,使用uint8进行存储,即减少了存储占用,又能方便数据分析。
拆为什么要先于"丢"和"填", 这并不是绝对的。但是,通常情况下,哪怕待拆分的列有缺失值或异常值,也是可以通过正则正常拆分的。拆分后有新的列产生,此时很自然需要单独的"丢"或"填"处理。
2、丢,主要针对四种类型:
①重复值(DataFrame.drop_duplicate(inplace=True))
②不研究的列(这需要我们开始就明确自己的研究目的), 比如我们拿到一份公司招聘数据,字段中还含有HR的名字和联系电话,这些数据正常只有我们真的想去找公司才需要,如果只是做数据分析直接舍去就好,能显著减少数据加载时间和内存占用,何乐而不为呢?
③缺失值过多或全是缺失值的列
比如一个列,里面8个字段有超过4个字段都有缺失值,此时其信息丢失实在太严重了,花费大力气去填补还不如直接舍去。还有些时候如一个csv文件你会看到n个连续",": ,,,,,,,
这种情况就是整行数据全为空了,自然也是直接舍弃掉,简单一句:
df.dropna(how="all", inplace=True)就搞定了,基本就是固定写法。
④异常值列(占比少时)
如果异常值占比少,丢掉几个异常值对整体分析结果影响就不大了。此时与其花功夫研究怎么填补他们,直接舍弃掉来得更加轻松,毕竟数据分析最终的目的是要得出一个有效结论的,不影响结论的数据怎么处理都行哈! 当然我们也要有意识的看看这些异常值是什么导致的,有时少部分的异常值可能暗含某种重要信息呢!
3、填
填充可谓大有学问,最简单的"众数, 中位数, 平均数"填补法仅仅是尽可能减少了异常值对整体分析结果的影响,但并不见得是最佳策略。有能力的尝试使用一些更高级的数学方法或机器学习啥的来填充,这样出来的分析结果就更加精确了。
4、格式化字段
所谓格式化就是统一了。如有的数据用中文数字"十", 有的用阿拉伯数字10,这种不统一的情况当然不能容忍,需要统一。特别的,格式化不一定放到最后,像一些数值型的异常值检查时我们可能就需要先格式化。
上述步骤总体并不是严格固定的,但基本可以遵循此顺序。统一过程无疑是最高效的!