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

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

大数据文摘作品,转载请注明来源

作者 | Michael Salmon

编译 | 颖子,江凡

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

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

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

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

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

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

  • 从数据中删除所有重复的招聘信息

  • 格式化所有可用的薪资数据,以便只显示预期年薪这一数据。

  • 在构建预测模型时,对字符串进行各种初步清洗以使之后的自然语言处理过程更容易。

删除重复的招聘信息

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

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

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

格式化薪资数据

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

scrape_data[“salary”].value_counts()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

额外的数据清洗

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

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

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

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

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

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

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

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

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

scrape_data.to_csv(“scraped_clean.csv”)

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

相关推荐