我有一个数据帧列,其值如下:
Salary Offered
----------------------
£18,323 per annum
£18,000 - £22,000 per annum
Salary not specified
£15,000 - £17,000 per annum, pro-rata
£37,000 - £45,000 per annum
£9,100 - £9,152 per annum, OTE
£9.25 - £10.15 per hour
£35,000 - £40,000 per annum
£23,000 - £26,600 per annum
£18,000 - £25,000 per annum, inc benefits
所以我运行了以下命令,它通过将None字符串值(例如:“Salary not specified”)替换为None来完成,我可以用随机值替换它,但是我必须再次将它们拆分为£ :
In[13]: df = pd.DataFrame(df.salary_offered.str.split('£',1).tolist(),
columns = ['flips','row'])
In[14]: df['row']
Out[14]:
0 18,323 per annum
1 18,000 - £22,000 per annum
2 None
3 15,000 - £17,000 per annum, pro-rata
4 37,000 - £45,000 per annum
5 9,100 - £9,152 per annum, OTE
6 9.25 - £10.15 per hour
7 35,000 - £40,000 per annum
8 23,000 - £26,600 per annum
9 18,000 - £25,000 per annum, inc benefits
此外,很少有行以每小时给出的工资,因此也需要更换它们,这可以直观地完成。但我想分成具有平均值的不同列,如下所示:
Salary (£)
---------------
18323
20000
18000
16000
41000
...
答案 0 :(得分:4)
如果我理解正确,您可以使用正则表达式提取所需内容(数字),并对结果进行计算:
salaries = (df['Salary Offered']
.str.replace(',','')
.str.findall(r'(\d+\.?\d+)')
.apply(lambda x: pd.Series(x).astype(float))
.mean(1))
>>> salaries
0 18323.0
1 20000.0
2 NaN
3 16000.0
4 41000.0
5 9126.0
6 9.7
7 37500.0
8 24800.0
9 21500.0
正则表达式解释:\d
找到任何数字字符。 \d+
找到任意多个数字的序列(+
表示正则表达式中的一个或多个)。 \.?
表示“可选地,找到任何.
”。
所有在一起,\d+\.?\d+
说:“找到任何数字序列,可选地后跟.
和另一个数字序列.
”。
处理per hour
vs per annum
我不确定你对per hour
行的意思是什么,但你说你可以直观地这样做,所以我想你有一个计划。
就个人而言,我会按照以下方式做一些事情,不过你可能需要根据你的数据框架和你想要捕获的内容进行调整。
salaries = (df['Salary Offered']
.str.replace(',','')
.str.findall(r'(\d+\.?\d+)')
.apply(lambda x: pd.Series(x).astype(float))
.mean(1)
.to_frame('salary offered'))
salaries['per'] = df['Salary Offered'].str.extract(r'(per\s\w+)')
>>> salaries
salary offered per
0 18323.0 per annum
1 20000.0 per annum
2 NaN NaN
3 16000.0 per annum
4 41000.0 per annum
5 9126.0 per annum
6 9.7 per hour
7 37500.0 per annum
8 24800.0 per annum
9 21500.0 per annum
答案 1 :(得分:2)
<强> 设置 强>
df = pd.DataFrame({'salary': ['£18,000 - £22,000 per annum', '£9.25 - £10.15 per hour']})
帮助函数从列中提取所有货币值并返回平均值:
def extract_average(s):
money = list(map(float, re.findall(r'£([\d\.]+)', s)))
return sum(money)/len(money)
str.replace
和 apply
:
df.salary.str.replace(',', '').apply(extract_average)
0 20000.0
1 9.7
Name: salary, dtype: float64