【问题标题】:Multiple regex replacements with pandas用 pandas 替换多个正则表达式
【发布时间】:2019-05-31 22:58:05
【问题描述】:

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

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

【问题讨论】:

    标签: python regex pandas dataframe replace


    【解决方案1】:

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

    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 这个语法
    • @pygo 谢谢 :-)
    • 啊,虽然我看到了不错的一个.. 我在我的笔记中添加了这个函数以供将来参考。
    【解决方案2】:

    我喜欢@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-21
      • 2014-04-30
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多