将字符串数值拆分为新列 - Pandas Dataframe

时间:2018-06-14 18:08:49

标签: python pandas dataframe data-presentation

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

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

2 个答案:

答案 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