我和月薪有個約定

用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\.]+’, ‘待查找字符串’)。

歡迎點贊,敬請關注!
返回頂部

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章