用熊猫替换多个正则表达式

时间:2019-01-05 18:03:15

标签: python regex pandas dataframe replace

我有一系列不同年龄的熊猫:

s = pd.Series([14,1524,2534,3544,65])

我想创建一个像这样的新系列:

0     0-14
1    15-24
2    25-34
3    35-44
4      65+

我可以使用映射做到这一点:

s = pd.Series([14,1524,2534,3544,65])
age_map = {
    14: '0-14',
    1524: '15-24',
    2534: '25-34',
    3544: '35-44',
    4554: '45-54',
    5564: '55-64',
    65: '65+'
}
s.map(age_map)

还使用多个正则表达式:

s = pd.Series([14,1524,2534,3544,65])
s = s.astype(str).str.replace(r'(\d\d)(\d\d)', r'\1-\2',regex=True)
s = s.astype(str).str.replace(r'14', r'0-14',regex=True)
s = s.astype(str).str.replace(r'65', r'65+',regex=True)
s

问题
我们可以将所有三个正则表达式组合成一个高级正则表达式并获得相同的结果吗?

类似:

s = pd.Series([14,1524,2534,3544,65])
pat = ''
pat_sub = ''
s = s.astype(str).str.replace(pat, pat_sub,regex=True)
s

2 个答案:

答案 0 :(得分:3)

您可以使用单个回调函数来处理所有情况:

def parse_str(match):
    a, b = match.groups()
    if not b:
        return f'0-{a}' if a == '14' else f'{a}+'    
    return f'{a}-{b}'

s.astype(str).str.replace(r'(\d{2})(\d{2})?', parse_str)

0     0-14
1    15-24
2    25-34
3    35-44
4      65+
dtype: object

如果您的系列仅包含两个或四个数字,这应该可以工作。

答案 1 :(得分:1)

我喜欢@coldspeed的答案,它更灵活并且功能可重复使用。

但是,我想到了这样的熊猫连锁经营:

s = s.astype(str).str.replace(r'14', r'0-14',regex=True)
                 .str.replace(r'65', r'65+',regex=True)
                 .str.replace(r'(\d\d)(\d\d)', r'\1-\2',regex=True))

s