![6a3b051b848d9f47a2907c8f1ce001f8.png](https://img-blog.csdnimg.cn/img_convert/6a3b051b848d9f47a2907c8f1ce001f8.png)
说在前面
衣服脏了,我们可以洗衣粉
水污了,我们可以使用净水机
数据脏了,怎么办?本文告诉您
那么有没有试想过数据有没有变“脏”[1]的时候呢?如图1-令人眼花缭乱的数据
![133283b2d8532dfd949d623680b38f7e.png](https://img-blog.csdnimg.cn/img_convert/133283b2d8532dfd949d623680b38f7e.png)
言归正传,准备好开始学习了吗?
实践是检验真理的唯一标准
如果真需要实践,可能需要用到的软件工具
Notepad
记事本(windows系统自带)推荐使用Notepad++
记事本高级软件Excel
电子表格软件Python Runtime
运行环境
快来对号入座了
有时候工作是给自己做的,在没有想着邀功、炫技的前提下,个人以为“前瞻性”也是非常有必要的,即便现在可以花5分钟的时间用最简单的方法完成工作,但是也会有一天再有可能遇到同样的功能,此刻是否还需要重复、机械的从头开始呢?
那么我们是不是也需要一劳永逸的技能傍身呢,即便加薪无望但是提高的效率便是时间金钱
呢,接下来开始咱们的段位设计呗
入门级
入门级使用的重要技能就两个,偶尔也会因为环境不允许被迫使用 [手动捂脸]
1. 找规律
2. 拼体力
- 首先仔细查看上面的数据,可以发现数据中频繁出现的标点符号是分号
;
和逗号,
,由此判断这堆杂乱的数据是使用标点符号对数据基础划分的(庆幸前任同事对我比较好,数据整理得还算有迹可循); - 有了规律,我们就要开始整理格式了,使用类似
记事本
这样的文本处理软件,按照动画图2-使用Notepad++批量替换的方式,可以实现把现有的规律转换成我们最终需要的,比如我们可以把分号;
转为换行符n
或rn
> 需要注意的是word
里面换行的用^p
表示;
![cbcb5fc67138adfe33036bf945744bc9.gif](https://img-blog.csdnimg.cn/img_convert/cbcb5fc67138adfe33036bf945744bc9.gif)
3. 对于这类比较有规律的数据,可以将初步处理好的数据复制到Excel
,按照下方动画图3-使用Excel数据分列功能切割数据的方式,继续基础级别的清洗。
![aa4a496eac963a28b450b32b06bad713.gif](https://img-blog.csdnimg.cn/img_convert/aa4a496eac963a28b450b32b06bad713.gif)
至此,入门级的手工方法,我只用过这些了,还是尽快开始咱们的编程救援行动
吧
其实吧,虽然在入门级使用找规律
和拼体力
这两种方法能解决大部分问题,工作总有隐形的力量和你作对,生在新时代的我们,二话不说就是干
伸手即得「一对快捷键快到怀疑人生」
开始另一个故事(又要编故事了……)
人生不如意之事十之八九,这就从老板让你「计算所有球的总数」开始,内心OS是不是又要开始浪起浪了,啊呸……程序猿小哥哥表示故事编不下去了,直奔主题了
这时收到这个梦碎的工作,还是先别着急,也不用烧香拜神,还是求求自己学一下这个 Excel
中的神技能吧
图3 已经获得了一列形如下表的数据信息:
- 数量及名称
- 持有79个足球
- 持有91个手球
- 持有14个篮球
- 持有79个排球
- 持有51个羽毛球
- 持有97个网球
- 持有88个高尔夫球
- 持有39个冰球
- 持有38个沙滩排球
- 持有51个棒球
- ……
既然故事已经发展到这里了,那咱们还有回到入门级使用 找规律
和 拼体力
的想法吗?
毕竟,我是比较有原则了,是坚决不会用繁琐的方式解决问题,所以咱们就只用一对快捷键结束老板的旨意吧
需要我们完成其实不是难在「计算总数」,而是从上面的文字列表中「提取出每一个球的个数」,因为非数字的文字是无法参与数学计算的。
分析结束,那我们愉快的结束吧
如动画图4-Excel中令人快乐的快捷键, 1. 首先在单元格B2
数据对应第一行手动输入提取出第一个内容, 2. 回车确认,点击鼠标选择刚才输入的单元格, 3. 快捷键CTRL
+E
(两个按键一起按下之后一起松开) 4. 最后就是见证奇迹的时刻了 5. 接下来是「计算所有球的总数」,就是直接使用Excel公式
中的=SUM(B2:B24)
求和公式,方法简单不再赘述,实在有需求欢迎文下留言,我统一解答
![ab0a2e8562440485d0f227471eccce28.gif](https://img-blog.csdnimg.cn/img_convert/ab0a2e8562440485d0f227471eccce28.gif)
童话故事级「欢迎体验骨感」
童话都是美好的,现实也更骨干,没错,你没有看错,作者花了1/5
的篇幅写了一个反面教材, 当然这是给读者的善意提示,也可以看作是给受同样折磨的读者一个泄愤的机会,欢迎文下留言,一起讨论工作中的“炫技”
如果嫌弃,那就跳过这个给工作添乱、帮倒忙的大脑短路型解题方式
吧
- 看看下面的动画图5-极有炫技嫌疑的惊奇操作,或许就能简单地认清,这类 背道而驰 的数据清洗处理方法,不仅更加繁琐,还可能带来
已知
或不可预知
的 错误后果,这也是我们在数据清洗过程中,需要稍加注意的问题。 - 使用 MID函数 固定截取我们需要的数据,使用自动填充拉取之后的数据,可能真的有些繁琐,甚至因为方法不通用而导致获取到错误数据!!!
![283d4b4f91785a34675829be49a57700.gif](https://img-blog.csdnimg.cn/img_convert/283d4b4f91785a34675829be49a57700.gif)
一劳永逸「知识技能积累型」
终于等到您,感谢有耐心的你,终于翻阅到了本文中最重点的部分,虽然学习成本稍微高,但也是最有综合竞争力的一项技能。
- 本部分内容可能比较适合已经掌握基础编程语法的读者延续参与。
- 当然如果您愿意有毅力学习编程或者其它计算机技术,那请持续关注我的后续文章,我们一起渐渐学习进步。
编程学习前我们的准备
- 软件和硬件
- 对编程的兴趣和热情
- 比较灵活的逻辑能力
- 事件关联能力,比如:把某一项工作和编程中的某一个方法进行关联,从而合并式地处理问题
- 电脑
Python Runtime
运行环境,点击这里直达Python官网
- 知识储备
- 一些数学基础知识
- 一些逻辑构建方法
- 流程图的阅读和绘画
- 最好擅长一门编程语言
- 如果以上知识都有待积累,转述一个坊间的偏方
《我的世界》是一个国外比较火的游戏,据说这可以成为编程学习的起源
继续完成今天“数据清洗”的选题
First. 时光退回到文章完成前
- 生成本文使用的数据素材,如下:
持有79个足球,已借出52%,还剩余可借38个;持有91个手球,已借出88%,还剩余可借11个;持有14个篮球,已借出10%,还剩余可借12个;持有79个排球,已借出45%,还剩余可借43个;持有51个羽毛球,已借出37%,还剩余可借32个;持有97个网球,已借出51%,还剩余可借47个;持有88个高尔夫球,已借出77%,还剩余可借19个;持有39个冰球,已借出16%,还剩余可借32个;持有38个沙滩排球,已借出47%,还剩余可借20个;持有51个棒球,已借出60%,还剩余可借20个;持有61个垒球,已借出79%,还剩余可借12个;持有34个藤球,已借出20%,还剩余可借27个;持有92个毽球,已借出53%,还剩余可借43个;持有52个乒乓球,已借出44%,还剩余可借29个;持有28个台球,已借出15%,还剩余可借23个;持有56个鞠蹴,已借出95%,还剩余可借3个;持有32个板球,已借出18%,还剩余可借26个;持有83个壁球,已借出97%,还剩余可借2个;持有76个沙壶,已借出92%,还剩余可借5个;持有11个冰壶,已借出87%,还剩余可借1个;持有83个克郎球,已借出19%,还剩余可借66个;持有59个橄榄球,已借出77%,还剩余可借13个;持有61个曲棍球,已借出22%,还剩余可借47个
不得不说的一个画外音
很显然这么繁杂的数据,人工生成是很无趣的事情,你不愿去做,当然我也不愿意,那么又很需要,怎么办呢? 答:当然是扔给
计算机
完成呢(心疼计算机 3秒)
- 要想成功的 指使
计算机
帮助人类完成工作,那么我们就需要使用它能听懂(理解)我们意图,唯一的途径就是编程语言
- 编程语言有很多,例如:C、C++、Java 等等数十种
- But,
Life is short, you need Python
(意译:人生苦短,我用 Python) - 所以,本文乃至今后的大部分创作,将会基于
Python
为主要使用的计算机语言
回到主题,如何生成上幅形如杂乱字符的数据信息,
import random
def gen_data():
# 球类列表
balls = ['足球', '手球', '篮球', '排球', '羽毛球', '网球', '高尔夫球',
'冰球', '沙滩排球', '棒球', '垒球', '藤球', '毽球', '乒乓球',
'台球', '鞠蹴', '板球', '壁球', '沙壶', '冰壶', '克郎球', '橄榄球', '曲棍球']
text = ''
# 是一个循环,用来 从 球类列表 逐个获取每一类 球的名称
for ball in balls:
# 总数
total = random.randint(10, 100)
# 借出率
borrow_rate = random.random()
# 空闲可借数
free = total - (total * borrow_rate)
# 借出率百分比
borrow_percent = '%2.f%%' % (borrow_rate * 100)
# 这里使用了一个 Python 语法糖:格式化字符串
text = text + '持有%d个%s,已借出%s,还剩余可借%d个' % (total, ball,
borrow_percent, free) + ';'
# 输出,很像就是计算机开口说话,
# 括号里面的数据内容就是 计算机准备告诉我们的
# 输出的内容,就是上面的那段 杂乱的数据
print(text)
Second. 时光回到文章编辑进行中,使用我们的办公助手电脑「计算所有球的总数」
import re
def analysis_data():
# 打开文件,也就是把保存成文件的数据读取到,电脑的运算部件,术语称为 加载数据到内存
with open('databalls_count.txt', 'r', encoding='UTF-8') as file:
data = file.read()
# 将那堆杂乱的数据,依据 分号; 划分成以小组为单位的数据,记录每一行信息
ball_items = str(data).split(';')
# 设定数据的过滤规则,读取数据,学名为 正则表达式
pattern = r'持有(d+)个'
# 用来记录统计总数的,我们可以看作 盛饭的碗,学名为 变量
total_sum = 0
# 将每一行项目都循环 过滤一遍
for ball_item in ball_items:
# 再依据 逗号, 划分成以小组为单位的数据,记录每一类求的单独统计个数
counts_per_ball = ball_item.split(',')
# 执行正则表达式,按照指定的规则从文本中读取过滤后的数据
# 这个也是 数据清洗 常用且有效的一个流程
m_res = re.findall(pattern, counts_per_ball[0])
total_sum = total_sum + int(m_res[0])
# 输出计算结果
print('所有球的总数=', total_sum)
上一段程序执行后输出的结果,如下:
所有球的总数= 1355
至此,我已将日常工作中常用的几种数据清洗
方式介绍结束了,可能是不专业的,但应该是比较有效率的工作生产力利器
写在后面
诚然我还是一个创作新手
- 我不是全职创作者,加之平时在学校教学生编程属于创作的时间较少,文章更新内容可能不是很合乎您的需要,但是我很期待您的评论留言,如果有大多数人需要获取的知识内容,我一定积极更新合乎大家的胃口。
- 作为长期以往的埋头 Coding ,实在
苦于
像今天这样 “以编故事的方式” 开始知识创作分享,尚不知如何选择多数人需要的选题、技术因故事侧重点太多看点变少。
很期待各位读者、网友,将需要获取的内容方向的在文下留言,我会积极整理,奉献更优质的内容给大家。
最后,感谢大家的阅读,希望我创作的内容,能给您的生活和工作起到帮助。
本文2020年3月10日首发于知乎
林星宇(言它)
言它www.zhihu.com![1c70628abd9d4f299bc8f90696ea36c9.png](https://img-blog.csdnimg.cn/img_convert/1c70628abd9d4f299bc8f90696ea36c9.png)
其他声明
本文除 角标注释
外,均是作者原创,所用故事、数据均是通过 计算机脚本程序
虚构,仅用于学习研究为目的,没有其他指代意义,如仍觉得侵犯个人权益,望与我联系,我定积极配合。
关于转载
- 为保证文章可读连贯性,请全文转载;创作不易,也望保留版权信息。
- 无其它特殊要求,转载自由,欢迎转载,感谢关注。
参考
- ^数据领域的“脏”意味着,我们手中持有的数据格式比较混乱,或者我们实际需要的信息里又夹杂了很多无关、无用的垃圾数据, https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97/4402497