如何使用基于优先级的正则表达式替换DataFrame列中的字符串?

时间:2015-07-21 22:11:04

标签: python pandas

我有一个手动输入职位的DataFrame列。有数百个,但我想将它们减少到以下的桶

CXO or Senior Vice President
Vice President
Director
Manager
etc...

有些职称拥有多个实际职称,如"首席执行官和营销总监等#34;或者"副总裁兼软件工程师"所以我想用排名最高的桶代替。这是我到目前为止所做的事情(这是行不通的。)

skip_jobs=[]
df['jobtitle'].replace(to_replace='.*[Cc].[Oo].*|.*[Vv]ice.*', value='CXO or Senior Vice President,
    regex=True, inplace=True)
skip_jobs.append('CXO or Senior Vice President')

df['jobtitle'][~df['jobtitle'].isin(skip_jobs)].replace(to_replace='.*VP*|.*[Vv]ice.*',
    value='Vice President', regex=True, inplace=True)
...

一个问题是regex = True意味着to_replace和value都被视为正则表达式,因此我匹配的任何模式都被替换为被视为正则表达式的值。我希望用一个新的字符串代替整个字符串 - 例如:"首席执行官兼营销总监"被" CXO或高级副总裁替换为#34;。如果有人有一些想法让我知道,谢谢你。

编辑:如何将剩余的作业标记为'其他'?以下是我目前正在使用的内容,但它会覆盖以前的部分作业。

skip_jobs = ['CXO or Sen. Vice Pres', 'Vice President'...]
df['jobtitle'][~df['jobtitle'].isin(skip_jobs)] = 'Other'

1 个答案:

答案 0 :(得分:0)

replace下的str方法更易于使用。你必须修改我的代码中的正则表达式以适合你的数据,但只记得匹配整个字符串。

>>> df['title']
0                  CXO or Senior Vice President
1                                Vice President
2                                           CEO
3                                       Manager

>>> df['title'] = df['title'].str.replace('^.*(C[A-Z]O|VP|[Vv]ice).*$', 'CXO or Senior Vice President')

>>> df['title']
0    CXO or Senior Vice President
1    CXO or Senior Vice President
2    CXO or Senior Vice President
3                         Manager