数据清洗要了命?这有一份手把手Python攻略

大数据文摘作品,转载要求见文末

作者 | Michael Salmon

编译 | 颖子,江凡

几个月前,我从网站indeed.com上抓取了招聘信息相关数据。相信很多同学都跟我做过同样的事情,想要收集不同城市的各种职位信息,然后建立一个模型来预测它们的相对薪水。

然而在建立模型之前,我需要对抓取的信息进行初步的分析和清洗。本文将简要介绍我在清洗数据过程中使用的一些技巧。

在这个任务中,我使用了python和配套的库,包括pandas和numpy。

之前我已经成功地从美国不同的城市中抓取并保存了大量的招聘信息,并将其导入到pandas数据框架中,如下图所示(你会发现绝大多数职位不包括工资信息):

为了完成清洗数据的任务,我有如下目标:

  • 从数据中删除所有重复的招聘信息
  • 格式化所有可用的薪资数据,以便只显示预期年薪这一数据。
  • 在构建预测模型时,对字符串进行各种初步清洗以使之后的自然语言处理过程更容易。

删除重复的招聘信息

最开始,我从保存的csv文件中读取数据,并检查格式。之后,我删除了所有重复行,并评估在抓取过程中我收集了多少不重复的内容。

仅在这个过程中,我的数据结构从128,289行减少到6,399行。虽然编程并不是很复杂,但我只想在之后的分析中使用不重复的招聘信息。

格式化薪资数据

为了准备计算薪酬的数据,我首先查看了一下正在处理的数值的数据类型:

scrape_data[“salary”].value_counts()

可以看出,这一数据的某些内容会使之后的计算变得复杂。Python在进行数学计算时并不知道如何处理像逗号和美元符号这样的字符,因此我们需要在进行下一步之前去除这些符号和“\n”字符。

除此之外,你还会注意到,薪水可以用单一数字或范围表示,而且会以不同的支付方式呈现——年薪,月薪,或时薪。在准备这些薪酬数据,以便进一步分析时,我需要将上述内容全部考虑进去。

一开始,我去除了那些无关的字符:

虽然在使用这些数据前,我知道我需要从薪资数据中删除这些支付方式不同的字符串(如,“一年”、“一月”),但是我想要保留这些原始支付方式以供将来使用。因此,我创建了一个新的数据列来捕捉这些数据。我将这列命名为“og_salary_period”:

然后我将所有含有薪资信息的岗位数据放在一个单独的数据结构中,这样我就可以相应地扩展这些数据。注意,我从原始的scale_data表中完全移除了带有薪资数据的行。当我将这些数据进行有效地规范后,我会将其重新添加回去。

下图是薪资数据结构的截图。你会注意到og_salary_period这一列捕获了原始薪资信息。

至此,我根据原始薪资数据的支付方式将职位信息和薪资信息分开。我也删除了与薪资支付方式有关的字符串。

之后,我定义了一个函数用来检测在一定范围内的薪资信息(通过在数据中查找连字符),并返回两个值的均值。如果没有连字符,它将以浮点数的形式返回单个值。

通过这个函数,我可以清洗薪资数据,并将任何未以年薪支付的薪资内容转换为大概的年收入。

(虽然是否保留按时薪和周薪支付的招聘信息还有待讨论,我决定保留是希望能有更多的可用数据,同时我认为这类支付方式也能与工作所能提供的真实薪金相近。)

最后,我将各种薪资数据结构加在一起,并重新放进原始的scrape_data中。虽然我用了两步做这件事,但可以将其整合成一步:

好了!薪资数据准备好了!

额外的数据清洗

在我准备好建模之前,我想完成更多的清洗任务,准备自然语言处理用的数据。

在去除所有数据中的特殊字符之前,我意识到在数据中有一些“r&d”(研究与开发)实例。为了避免仅简单地剥离“&”符号而剩下“r”和“d”两个单独的字符,我希望在进一步删除特殊字符前,有针对性的更改这个特定字符串:

接下来,我定义了一个函数去扫描一列,并去除了特殊字符表中的所有字符。之后我在每一列中都应用了这一函数,除了“salary”(浮点数据列)和“og_salary_period”(我专门创建此列不包含任何字符)这两列。

最后,我稍微清理了一下位置信息。我注意到某些包含位置信息的招聘内容仅仅提到了“在美国”。由于这种信息没有任何作用,所以在这种情况下,我将这些值同我抓取到的城市名称一同输入。

另外,为了简化位置数据,我仅保留了每份招聘信息的州名和城市名。这意味着要拆分邮政编码的位置信息。我意识到在这一过程中我会失去一部分信息,但我觉得这会使检查各组位置更为容易,同一地方只使用唯一的表述不会对自然语言处理分析造成太大的影响。

就是这样!最后一步是将数据保存为已清洗好的csv文件,以便更容易地加载和建模。

scrape_data.to_csv(“scraped_clean.csv”)

看完本文作者的分享是不是心痒难耐,也想自己上练练手啊?或者,你那里有更好的建议想分享给大家?大数据文摘刚刚爬下了5万条职位数据来辅助我们《数据团队建设报告》的分享,想要练手清洗、加入这个大工程的同学请点击文末阅读原文填写表单加入我们的数据清洗团队,和志同道合的cleaner们一起玩儿起来!

原文链接:https://medium.com/towards-data-science/data-cleaning-web-scraped-job-data-6c2a2d963cd

关于转载 如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 | bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。

原文发布于微信公众号 - 大数据文摘(BigDataDigest)

原文发表时间:2017-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林欣哲

科个普啦—抽象的理念

抽象是我们生活中普遍使用的一个概念,比如说你今天要出门,跟司机说“去科技园”,我们就用到了抽象的概念,我们只描述了去某个地方,而不是深入的描述,“左转,直走一个...

36680
来自专栏Crossin的编程教室

input vs raw_input

今天是教师节,祝老师们节日快乐。然后,今早,我居然也收到了祝福。。。暗自窃喜。 把之前有几篇不属于课程系列的文章整理了一下,回复 w 可以看到文章列表。包括罚点...

313110
来自专栏web编程技术分享

小兔JS教程(一) -- 环境搭建与JavaScript初探1.开发环境搭建2.JavaScript初探

35290
来自专栏云加头条

腾讯云文件存储CFS中国香港地区上线,打造企业出海高速直通车

2017年11月22日,腾讯云率先在香港地区推出了文件存储CFS,以中国香港为中心辐射国外市场,满足公有云客户日益增长的业务出海需求。这也是国内首家在香港地区提...

27200
来自专栏码神联盟

Java学到什么程序可以去面试以及面试范围

Java学到什么程度可以去找工作及面试流程 ? 1简历 简历里面需要包含的内容应该是个人信息、比如:学历,工作年限、邮箱、姓名、目前状态(是否离职),专业技能(...

491100
来自专栏CDA数据分析师

帮你提升 Python 的 27 种编程语言

27 种语言 过程型编程语言: C, Rust, Cython 面向对象数据建模语言: Java, C#, Eiffel C 的面向对象衍生语言: C++, D...

25880
来自专栏Golang语言社区

GO 开发者对 GO 初学者的建议

注:原文地址为 Advise from Go developers to Go programming newbies 以促进 India 的 go 编程作为 ...

37260
来自专栏老九学堂

学编程一开始就值得坚持的习惯

学习任何一门技术,在一开始就养成优秀的习惯,这是非常重要的。 1 看官方文档 遇到不清楚或不懂的知识点,先去看官方文档! 很多官方文档是英文的,硬着头皮也要看...

40990
来自专栏Java学习网

优秀程序员的 18 大法则

优秀程序员的 18 大法则 经过多年的积累,我发现,下面这些基本的指导法则,可以帮助我成为一个更加高效的程序员。 程序设计法则,与设计和工程的原理密切相关。下面...

26350
来自专栏web前端教室

想靠狂看JS教程来快速提高前端水平?90%的人都选错了方向...

文章开头第一句,“请大家放心,这篇文章一定不是标题党。” <!-- 说话要有根据 --> 狂看JS教程,能不能快速提高前端水平? 肯定有人能。 你能不能?不好说...

27570

扫码关注云+社区

领取腾讯云代金券