我和月薪有个约定——功夫大侠pandas处理薪水数据

欢迎点赞,敬请关注!

《我和月薪有个约定》——用pandas对各种薪水数据进行规约


天下熙熙,皆为利来;天下攘攘,皆为利往。
招聘负责人和招聘网站的编辑们,连薪水的格式也没空统一了。于是乎,小伙伴们用爬虫获取的招聘信息中,出现了五花八门的格式,钱果真成了“花花绿绿”的好东西。
以下的薪水数据中,出现了“None(面议)、万/月、万/年、千/月、元/天、元/小时、万以下/年、万以上/年、万以上/月、千以下/月”等多种单位,估计是招聘网站故意挖坑,为难爬取数据的小伙伴。
不过这点小坑,岂能难倒我们数据分析的征途(我们有功夫熊猫——pandas,我们的目标是星辰大海)。
pandas

数据导入

import pandas as pd
import json


file = open("./job.json", 'r', encoding='utf-8')
papers = []
for line in file.readlines():
    dic = json.loads(line)
    papers.append(dic)
    
data = pd.read_json(json.dumps(papers))

五花八门的“钱程”

返回顶部

data['Salary'].unique()
array(['1.3-2.5万/月', None, '1.2-1.8万/月', '1.5-2.5万/月', '1.2-1.6万/月',
       '0.8-1.5万/月', '1-1.5万/月', '30-50万/年', '1.3-2万/月', '17-30万/年',
       '1-1.8万/月', '0.8-1万/月', '2-3万/月', '1.1-2万/月', '0.8-1.6万/月',
       '1-5千/月', '3-3.5万/月', '1.3-1.8万/月', '2.5-5万/月', '1-1.4万/月',
       '0.7-1万/月', '1.5-2万/月', '1-3万/月', '20-40万/年', '2-6万/月', '10-15万/年',
       '6-8千/月', '0.8-1.2万/月', '0.6-1.5万/月', '2.5-3万/月', '15-25万/年',
       '184元/天', '6-9千/月', '1-2万/月', '1.2-2.5万/月', '2-3.5万/月', '2.5-4万/月',
       '1-2.5万/月', '0.6-2万/月', '0.5-1万/月', '1.5-3万/月', '0.8-2万/月',
       '3-4万/月', '1.8-3万/月', '0.6-1万/月', '1.5-3.5万/月', '0.9-1.6万/月',
       '0.8-1.8万/月', '6.5-9.5千/月', '1.2-2万/月', '2.6-4万/月', '0.7-1.5万/月',
       '0.9-1.5万/月', '1.4-1.8万/月', '1-1.6万/月', '0.6-1.2万/月', '2-2.5万/月',
       '2.3-2.8万/月', '2-4万/月', '1.5-2.2万/月', '1.1-1.5万/月', '0.6-1.6万/月',
       '1.2-2.4万/月', '1.2-2.2万/月', '1.5-1.9万/月', '1.3-2.6万/月', '20-30万/年',
       '5-7千/月', '15-20万/年', '30-40万/年', '1.1-1.8万/月', '1.2-1.5万/月',
       '1.3-2.2万/月', '0.7-1.4万/月', '10-30万/年', '2.5-3.5万/月', '1.5-1.8万/月',
       '0.7-1.2万/月', '1.5千以下/月', '40-60万/年', '1.8-2.5万/月', '3-4.5千/月',
       '14-18万/年', '0.7-1.3万/月', '10-20万/年', '150元/天', '1.6-2.2万/月',
       '0.5-1.2万/月', '18-40万/年', '1.8-2.3万/月', '1.8-2.2万/月', '1.5-4万/月',
       '2.2-3万/月', '2-3千/月', '0.8-1.4万/月', '11-16万/年', '4-5万/月',
       '1.4-2万/月', '2.5-4.5万/月', '1.8-4万/月', '1.3-1.7万/月', '0.9-1.1万/月',
       '4.5-6千/月', '2-2.2万/月', '50-60万/年', '7-8千/月', '3-5千/月',
       '2.2-3.8万/月', '1.1-1.3万/月', '2.2-4万/月', '1-5万/月', '0.9-1.2万/月',
       '2.2-4.3万/月', '18-22万/年', '1-4万/月', '1.2-3万/月', '9-15万/年',
       '0.9-2万/月', '1.5-1.7万/月', '2.5-5.5万/月', '12-30万/年', '1.5-2.8万/月',
       '140元/天', '2.5-12万/月', '1.5-5万/月', '70-100万/年', '3-6千/月',
       '40-50万/年', '12-25万/年', '3-5万/月', '10-13万/年', '1.2-1.7万/月',
       '30-60万/年', '32-50万/年', '60-80万/年', '25-35万/年', '1000元/天',
       '5-8千/月', '4-8万/月', '21元/小时', '0.9-1.4万/月', '3-4.5万/月', '2-5万/月',
       '50-120万/年', '50-80万/年', '20-100万/年', '3-6万/月', '180元/小时',
       '1.1-1.7万/月', '3.5-5千/月', '25-30万/年', '3-4千/月', '300元/天', '3-7万/月',
       '0.7-1.1万/月', '20-60万/年', '20-35万/年', '1.2-1.4万/月', '0.9-1.3万/月',
       '1.2-2.8万/月', '200元/天', '0.3-1万/月', '5-6千/月', '2-4千/月',
       '2.2-4.4千/月', '20-28万/年', '2-2.3万/月', '0.8-1.3万/月', '15-30万/年',
       '1-1.2万/月', '6-7千/月', '45-68万/年', '180元/天', '6.5-9千/月',
       '1.8-4.2万/月', '3.5-4.5万/月', '2.8-3万/月', '1.1-1.6万/月', '0.8-1.1万/月',
       '1.6-3万/月', '10-25万/年', '5元/小时', '90元/天', '20-50万/年', '1.5-2.3万/月',
       '0.9-1.7万/月', '50-100万/年', '2-3.3万/月', '15-22万/年', '2.5-6万/月',
       '1.8-2万/月', '10万以上/月', '6-15万/年', '8-30万/年', '240元/天', '4.5-9千/月',
       '0.6-3万/月', '0.7-1.6万/月', '4.5-7千/月', '1.3-1.5万/月', '1.4-1.5万/月',
       '0.4-1万/月', '7-9千/月', '1500元/天', '8-9千/月', '7-12万/月', '1.5-1.6万/月',
       '0.8-2.5万/月', '20-80万/年', '5-9千/月', '18-30万/年', '1-1.3万/月',
       '0.6-1.7万/月', '23-70万/年', '10-17万/年', '160元/天', '1.8-2.8万/月',
       '2-2.8万/月', '25-50万/年', '12-15万/年', '2.2-2.5万/月', '10-10万/年',
       '100元/天', '0.9-1万/月', '8-14万/年', '1.6-2.5万/月', '20-45万/年',
       '2.5-5千/月', '4-6万/月', '0.9-1.8万/月', '25-45万/年', '25-40万/年',
       '30-45万/年', '1.5-2千/月', '10-35万/年', '500元/天', '0.7-2万/月',
       '1.3-4万/月', '1.4-1.6万/月', '6-8万/年', '15-40万/年', '1.4-2.2万/月',
       '220元/天', '8-10万/年', '1-2.2万/月', '3-3.5千/月', '9-12万/年',
       '0.5-1.5万/月', '12-21万/年', '1.6-2.3万/月', '1.5-7万/月', '1.5-2.1万/月',
       '250元/天', '1.5-3.9万/月', '50-55万/年', '1.3-1.6万/月', '1600元/天',
       '18-25万/年', '15-18万/年', '4-7千/月', '12-20万/年', '2-3.1万/月', '4-6千/月',
       '1.4-1.7万/月', '120元/天', '200元/小时', '35-50万/年', '1.4-2.1万/月',
       '0.6-1.1万/月', '1.6-2.6万/月', '1.2-1.9万/月', '400元/天', '1.2-2.1万/月',
       '2.8-4.5万/月', '1-1.1万/月', '18-24万/年', '24-30万/年', '5-7万/月',
       '15-23万/年', '28-30万/年', '1-1.7万/月', '1-1.9万/月', '3-4万/年', '125元/天',
       '1.7-2.5万/月', '1.7-2.1万/月', '2.8-4.1万/月', '5-10万/月', '0.2-1万/月',
       '2万以下/年', '1.2-2.6万/月', '1.3-2.3万/月', '0.8-1.7万/月', '25-43万/年',
       '40-83万/年', '40-82万/年', '40-70万/年', '40-100万/年', '27-54万/年',
       '3.3-4万/月', '1.5-4.5万/月', '1.7-2.7万/月', '2.5-3.8万/月', '2.2-3.5万/月',
       '1.6-2.8万/月', '35-60万/年', '45-75万/年', '18-23万/年', '3.8-4.5万/月',
       '1.8-3.5万/月', '0.4-1.2万/月', '1.8-2.7万/月', '19-27万/年', '260元/天',
       '3.5-5.5千/月', '2.9-4万/月', '2-3.9万/月', '1-3.5万/月', '1.8-3.6万/月',
       '3.5-6万/月', '45-70万/年', '4-7万/月', '30-80万/年', '1.8-3.2万/月',
       '4.5-8千/月', '1.1-2.2万/月', '3-3.6万/月', '4-6.5万/月', '0.7-2.5万/月',
       '4-8千/月', '6-8.5千/月', '28-35万/年', '1.2-2.3万/月', '21-42万/年',
       '1.4-2.8万/月', '1.8-2.4万/月', '1.6-2万/月', '1.5-2.7万/月', '1.5-3.2万/月',
       '4.5-6.5万/月', '6-10万/月', '3.5-5万/月', '6.5-8千/月', '15-32万/年',
       '5-6.5千/月', '210元/天', '1.5-6万/月', '1.6-2.1万/月', '2.3-2.9万/月',
       '8-15万/年', '6-7.5千/月', '0.6-1.3万/月', '4.5-6万/月', '1.3-2.1万/月',
       '1.7-1.9万/月', '1.7-2.4万/月', '2.5-3.3万/月', '10-12万/月', '40-80万/年',
       '1.4-1.9万/月', '2.9-4.6万/月', '3-4.2万/月', '42-72万/年', '26-36万/年',
       '5-6万/月', '15-35万/年', '1.6-1.7万/月', '23-35万/年', '2.8-4万/月',
       '30-120万/年', '5-8万/月', '2-2.4万/月', '2.8-3.8万/月', '2-2.7万/月',
       '0.5-1.1万/月', '9-18万/年', '1.3-1.9万/月', '1-2.1万/月', '3-8千/月',
       '1.4-2.5万/月', '20-25万/年', '16-36万/年', '2.2-3.2万/月', '15-50万/年',
       '1.8-2.9万/月', '3.6-5.4万/月', '3-4.8万/月', '18-26万/年', '16-30万/年',
       '2.4-4.8万/月', '1.5-2.5万/年', '2.5-4.5千/月', '7-10万/月', '2.6-3.7千/月',
       '80-120万/年', '100万以上/年', '2.5-3.5千/月', '80-100万/年', '8-12万/月',
       '130元/天', '30-80万/月', '11-20万/月', '1.1-2万/年', '2.5-4千/月', '2-3万/年',
       '2.5-3.5万/年'], dtype=object)

对薪水进行规约

返回顶部
分最低和最高薪水,单位按:万/月。
思路:
(1) 将空元素None先用’面议’替换,避免后面报错;
(2) 数据表增加两列[‘min_salary’]和[‘max_salary’],初值同[‘Salary’];
(3) 用正则表达是re.findall(r’[\d\.]+’, ‘待查找字符串’)截取字符串中的数字和小数点,并转浮点数(必要时四舍五入,保留1位小数);
(4) 对于日薪,按一个月22天折算月薪;对于时薪,按一个月22天每天8小时折算月薪;
(5) 将‘面议’用其它数据的中位数替换。

# 将空元素None先用'面议'替换,避免后面报错
data[['Salary']] = data[['Salary']].fillna('面议')

# 数据表增加两列['min_salary']和['max_salary'],初值同['Salary']
data['min_salary'] = data['Salary']
data['max_salary'] = data['Salary']
# 使用"字符串包含函数"——str.contains
# 使用正则函数——re.findall(r'[\d\.]+', '待查找字符串')
import re

# 对"万/月"进行处理
data.loc[data['Salary'].str.contains('万/月'), 'min_salary'] = data[data['Salary'].str.contains('万/月')]['min_salary'].apply(lambda x:float(re.findall(r'[\d\.]+', x)[0]))
data.loc[data['Salary'].str.contains('万/月'), 'max_salary'] = data[data['Salary'].str.contains('万/月')]['max_salary'].apply(lambda x:float(re.findall(r'[\d\.]+', x)[1]))
# 对"万/年"进行处理
# 年按12薪
# 四舍五入函数round
data.loc[data['Salary'].str.contains('万/年'), 'min_salary'] = data[data['Salary'].str.contains('万/年')]['min_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) / 12, 1))
data.loc[data['Salary'].str.contains('万/年'), 'max_salary'] = data[data['Salary'].str.contains('万/年')]['max_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[1]) / 12, 1))
# 对"千/月"进行处理
data.loc[data['Salary'].str.contains('千/月'), 'min_salary'] = data[data['Salary'].str.contains('千/月')]['min_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) / 10, 1))
data.loc[data['Salary'].str.contains('千/月'), 'max_salary'] = data[data['Salary'].str.contains('千/月')]['max_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[1]) / 10, 1))
# 对"万以下/年"的最低最高薪水,均按最高处理
data.loc[data['Salary'].str.contains('万以下/年'), 'max_salary'] = data[data['Salary'].str.contains('万以下/年')]['max_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) / 12, 1))
data.loc[data['Salary'].str.contains('万以下/年'), 'min_salary'] = data[data['Salary'].str.contains('万以下/年')]['max_salary']
# 对"万以上/年"的最低最高薪水,均按最低处理
data.loc[data['Salary'].str.contains('万以上/年'), 'min_salary'] = data[data['Salary'].str.contains('万以上/年')]['min_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) / 12, 1))
data.loc[data['Salary'].str.contains('万以上/年'), 'max_salary'] = data[data['Salary'].str.contains('万以上/年')]['min_salary']
# 对"万以上/月"的最低最高薪水,均按最低处理
data.loc[data['Salary'].str.contains('万以上/月'), 'min_salary'] = data[data['Salary'].str.contains('万以上/月')]['min_salary'].apply(lambda x:float(re.findall(r'[\d\.]+', x)[0]))
data.loc[data['Salary'].str.contains('万以上/月'), 'max_salary'] = data[data['Salary'].str.contains('万以上/月')]['min_salary']
# 对"千以下/月"的最低最高薪水,均按最高处理
data.loc[data['Salary'].str.contains('千以下/月'), 'max_salary'] = data[data['Salary'].str.contains('千以下/月')]['max_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) / 10, 1))
data.loc[data['Salary'].str.contains('千以下/月'), 'min_salary'] = data[data['Salary'].str.contains('千以下/月')]['max_salary']
# 对日薪"元/天"的最低最高薪水,均按22天
data.loc[data['Salary'].str.contains('元/天'), 'max_salary'] = data[data['Salary'].str.contains('元/天')]['max_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) * 22 / 10000, 1))
data.loc[data['Salary'].str.contains('元/天'), 'min_salary'] = data[data['Salary'].str.contains('元/天')]['max_salary']
# 对时薪"元/小时"的最低最高薪水,均按22天 × 8小时
data.loc[data['Salary'].str.contains('元/小时'), 'max_salary'] = data[data['Salary'].str.contains('元/小时')]['max_salary'].apply(lambda x:round(float(re.findall(r'[\d\.]+', x)[0]) * 22 * 8 / 10000, 1))
data.loc[data['Salary'].str.contains('元/小时'), 'min_salary'] = data[data['Salary'].str.contains('元/小时')]['max_salary']
# 将"面议"用其它已知数据中位数代替
data.loc[data['Salary'] == '面议', 'max_salary'] = data[data['Salary'] != '面议']['max_salary'].median()
data.loc[data['Salary'] == '面议', 'min_salary'] = data[data['Salary'] != '面议']['min_salary'].median()

验证

返回顶部

data['min_salary'].unique()
array([1.3, 1.2, 1.5, 0.8, 1.0, 2.5, 1.4, 2.0, 1.1, 0.1, 3.0, 0.7, 1.7,
       0.6, 0.4, 0.5, 1.8, 0.9, 2.6, 2.3, 3.3, 0.3, 1.6, 2.2, 0.2, 4.0,
       4.2, 5.8, 2.7, 5.0, 2.1, 3.2, 3.8, 3.5, 2.8, 10.0, 7.0, 1.9, 2.9,
       4.5, 6.0, 3.6, 2.4, 6.7, 8.3, 8.0, 30.0, 11.0], dtype=object)
data['max_salary'].unique()
array([2.5, 2.0, 1.8, 1.6, 1.5, 4.2, 1.0, 3.0, 0.5, 3.5, 5.0, 1.4, 3.3,
       6.0, 1.2, 0.8, 2.1, 0.4, 0.9, 4.0, 2.8, 2.2, 2.4, 1.9, 2.6, 0.7,
       1.7, 0.1, 1.3, 0.3, 2.3, 4.5, 1.1, 0.6, 3.8, 4.3, 5.5, 12.0, 8.3,
       6.7, 2.9, 8.0, 10.0, 3.2, 7.0, 5.7, 0.2, 5.8, 3.9, 4.6, 3.1, 4.1,
       3.6, 6.9, 6.8, 2.7, 6.2, 6.5, 5.4, 4.8, 80.0, 20.0], dtype=object)
data.head(5)
Author Salary Area Experience School Job_Describe Keyword min_salary max_salary
0 Python开发工程师 1.3-2.5万/月 上海 3-4年经验 本科 长宁区通协路268号... [高级软件工程师, 软件工程师, python, 英语] 1.3 2.5
1 大数据研发工程师 面议 上海 硕士 招1人 工作地点:张江 岗位职责: -参与基于大数据平台的网站用户行为分析业务; 任职要求: -硕士... [软件工程师, 互联网软件开发工程师, 研发, 数据统计, hadoop, HBase, H... 1.3 2
2 python开发工程师(J10421) 1.2-1.8万/月 上海-浦东新区 3-4年经验 本科 工作职责:1、参与开发和维护后端 Python 服务框架;2、参与开发和维护数据统计、分析系... [Python开发工程师, python] 1.2 1.8
3 Python高级开发工程师 1.5-2.5万/月 上海-徐汇区 无需经验 本科 岗位描述:1、负责快仓智能驾驶平台(SDK)的平台开发工作;2、负责基于快仓智能驾驶平台的应... [Python开发工程师, python] 1.5 2.5
4 服务端开发工程师-Python方向-2020春招 面议 上海 在校生/应届生 本科 工作职责:1、负责运营后台的项目开发,参与构建运营预警平台和运营管理系统,实现后台、界面效果... [软件工程师, Python开发工程师] 1.3 2
data.tail(5)
Author Salary Area Experience School Job_Describe Keyword min_salary max_salary
6255 创新发展部-应用运维工程师 面议 上海-浦东新区 2年经验 本科 工作职责:1.金融、经济、生物医学、数学、物理、计算机或其他相关专业硕士及以上学历,其中本科... [技术支持/维护工程师, 互联网软件开发工程师] 1.3 2
6256 创新发展部-后台应用开发工程师(互联网) 面议 上海-浦东新区 3-4年经验 本科 工作职责:1、解析业务需求,划分功能模块,制定开发计划,遵照要求完成技术设计和开发工作;2、... [软件工程师, 移动开发工程师] 1.3 2
6257 创新发展部-机器学习工程师(图像识别) 面议 上海-浦东新区 3-4年经验 硕士 工作职责:1、利用计算机视觉技术和机器学习(深度学习)技术开发图像识别系统;2、设计高效的用... [移动开发工程师, 互联网软件开发工程师] 1.3 2
6258 创新发展部-数据挖掘工程师 面议 上海-浦东新区 3-4年经验 本科 工作职责:1、基于采集数据提炼、分析、归纳用户属性、行为等信息,输出分析报告; 2、处理用户... [数据库工程师/管理员] 1.3 2
6259 投资管理部-组合资产配置岗 面议 上海-浦东新区 1年经验 硕士 工作职责:1.建立和完善各账户组合管理制度,拟定各账户组合管理相关的工作规划;2.根据资金性... [投资/理财顾问, 金融产品经理] 1.3 2

总结

  1. pandas有强大的数据处理能力。
  2. 根据实际情况使用正则并验证,re.findall(r’[\d\.]+’, ‘待查找字符串’)。

欢迎点赞,敬请关注!
返回顶部

原创文章 43 获赞 14 访问量 2841

猜你喜欢

转载自blog.csdn.net/weixin_45221012/article/details/105517276