将字符串数值拆分为新列 - 熊猫数据帧



我有一个数据帧列,其值如下:

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,我可以用随机值替换它,但我必须再次将它们除以 £:

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
...

如果我理解正确,您可以使用正则表达式提取所需的(数字(,并对结果进行计算:

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 hourper 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'(persw+)')
>>> 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

设置

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.replaceapply

df.salary.str.replace(',', '').apply(extract_average)
0    20000.0
1        9.7
Name: salary, dtype: float64

最新更新