本文由 brzhang https://cloud.tencent.com/developer/user/1203298 发表
数据清洗
首先, 为何需要对数据进行清洗
数据清洗的工作绝壁是非常枯燥的, 做数据研究的的人绝对无法避开这个环节, 其根本原因是因为我们从各种渠道拿到的数据可能会出现:
1, 不合理的数据, 你比如, 样本中有些人的年龄超过了 120 岁, 楼层的高度达到了 1000 层, 以及其他的一些非常不合理的场景.
2, 错误的类型, 你比如, 样例中, 几乎所有的数据都是整形, 然而, 有一些是字符串类型, 如果不进行处理, 将这些数据直接喂给算法, 一般情况下是要崩溃的.
3, 计算机对于处理字符串类型比较吃力, 有时候, 需要我们将他转化为数字类型, 这样就设计到一个映射关系, 比如, 样例性别,[男, 女] , 我们可以转化为 1,2, 房屋的类型[单间, 一房一厅, 二房一厅, 三房一厅, 商铺] 可以对应的枚举出来, 比如我在处理房屋朝向上的示例
- # 提取房屋的朝向
- def parse_orientation(row):
- if '朝西南' in row:
- return 1
- elif '朝东北' in row:
- return 2
- elif '朝东' in row:
- return 3
- elif '朝南' in row:
- return 4
- elif '朝西北' in row:
- return 5
- elif '朝北' in row:
- return 6
- elif '朝东南' in row:
- return 7
- elif '朝南北' in row:
- return 8
- elif '朝西' in row:
- return 9
- else:
- return 10
等等等等, 我想说的是绝对还有很多你意想不到的场景, 需要你耐心的打磨数据, 将搜集到的原始数据, 清洗成为可用的数据.
数据清洗需要掌握哪些黑科技
通常我们拿到的数据数据都可以简化为表格模型, 无用你是 xsl 也好, CSV 亦或 JSON 数组也好, 都可以利用 pandas 来读取, 读取之后, 接下来的工作基本上就是借助在 pandas 的一些 API 来做数据清洗工作了, 如下, 我读取了一份房价信息的数据表, 这份数据当然是我自己根据上一篇文章, 利用 scrapy 做了一个爬虫爬取的咯.
jupyter 笔记
为了让我们能够更好的玩数据清洗, 我也不吝啬的贡献出了一份非常全面的 pandas 的操作 Cheatsheet 一份, 以及后面你一定会用到一个万能的 CheatSheet.
来来, 简单的了解一下 pandas 的一些常用的 API 了, 举例就用:
示例数据一行
1, 取子集常用操作
取子集
其中, loc 是支持按照列名字符串的方式来取子集, iloc 支持的是使用数组索引 (从 0 开始) 的方式来取子集, 通常, 逗号前面是行相关的一些条件限制, 逗号右边则是列相关的限制. 比如, 我取得
我就取前两列
2, 处理空白数据行
处理空白数据
这种就很简单愉快了, 一个 API 就可以删除或者填充有空白数据的样本了.
这个就不演示了, 因为我是爬虫爬取数据, 所以在爬取的过程中, 我已经对数据进行了一些基础的处理, 程序控制不可能出现空白数据了, 所以, 我也是建议, 自己写爬虫去获取数据, 这些减轻数据清洗环节的压力.
3,apply 系列
apply 其实有比较多兄弟, 比如 applymap,map, 他们的能力各有不同, 总的来说就是 apply()是一种让函数作用于列或者行操作, applymap()是一种让函数作用于 DataFrame 每一个元素的操作, 而 map 是一种让函数作用于 Series 每一个元素的操作, 如下所示, 我这里对 ege 列进行处理了一了, 将数字和文本归一化为数字.
apply 示例
实际上, 这个操作完全可用 map 来做:
- df['ege'] = df['ege'].map(parse_house_age)
- df.head(5)
结果完全一样, 因为我们只取了一列.
数据清洗比较高级的方式, 使用各种图表
1, 使用散点图
房屋总面积对应总价图
2, 房价热力值图:
房价区间热力图
图描述了房间分布区间, 可以清洗看出一些问题.
3, 频率直方图帮助我们迅速找到一些特例独行的猪, 因为他出现的次数少嘛, 不得不让人怀疑这种数据的真实性.
利用直方图快速找出毛刺点
ok, 总的来说, 这个过程需要开动自己的脑经, 把你拿到的原始数据, 慢慢慢慢的, 变成可以给你下面算法需要的数据.
来源: https://juejin.im/post/5bf7cfa3f265da61783114b8