1

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

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

2 回答 2

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 hourvsper 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
于 2018-06-14T18:18:57.117 回答
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.replaceapply

df.salary.str.replace(',', '').apply(extract_average)

0    20000.0
1        9.7
Name: salary, dtype: float64
于 2018-06-14T18:20:04.760 回答