【问题标题】:pandas Series replace using dictionary with regex keys熊猫系列使用正则表达式键替换字典
【发布时间】:2018-02-20 01:53:58
【问题描述】:

假设有一个数据框定义为

df = pd.DataFrame({'Col_1': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', '0'], 
                   'Col_2': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', '0']})

看起来像

   Col_1 Col_2
0      A     a
1      B     b
2      C     c
3      D     d
4      E     e
5      F     f
6      G     g
7      H     h
8      I     i
9      J     j
10     0     0

我想使用定义为的字典替换 Col_1 中的值

repl_dict = {re.compile('[ABH-LP-Z]'): 'DDD',
             re.compile('[CDEFG]'): 'BBB WTT',
             re.compile('[MNO]'): 'AAA WTT',
             re.compile('[0-9]'): 'CCC'}

我希望得到一个新的数据框,其中 Col_1 应该如下所示

      Col_1
0       DDD
1       DDD
2   BBB WTT
3   BBB WTT
4   BBB WTT
5   BBB WTT
6   BBB WTT
7       DDD
8       DDD
9       DDD
10      CCC

我只是简单地使用df['Col_1'].replace(repl_dict, regex=True)。但是,它并没有产生我期望的结果。我得到的是这样的:

                      Col_1
0     BBB WTTBBB WTTBBB WTT
1     BBB WTTBBB WTTBBB WTT
2                   BBB WTT
3                   BBB WTT
4                   BBB WTT
5                   BBB WTT
6                   BBB WTT
7     BBB WTTBBB WTTBBB WTT
8     BBB WTTBBB WTTBBB WTT
9     BBB WTTBBB WTTBBB WTT
10                      CCC

如果有人能告诉我为什么 df.replace() 对我不起作用,以及替换多个值以获得预期输出的正确方法,我将不胜感激。

【问题讨论】:

    标签: regex python-3.x pandas replace


    【解决方案1】:

    使用锚点(^$,即):

    repl_dict = {re.compile('^[ABH-LP-Z]$'): 'DDD',
                 re.compile('^[CDEFG]$'): 'BBB WTT',
                 re.compile('^[MNO]$'): 'AAA WTT',
                 re.compile('^[0-9]+$'): 'CCC'}
    

    使用df['Col_1'].replace(repl_dict, regex=True)

    0         DDD
    1         DDD
    2     BBB WTT
    3     BBB WTT
    4     BBB WTT
    5     BBB WTT
    6     BBB WTT
    7         DDD
    8         DDD
    9         DDD
    10        CCC
    

    【讨论】:

    • 嘿,如果它与特定模式匹配,我可以替换整个值吗,例如:rawData['srce'] = np.where(rawData['srce'].str.contains('WEB '),'WEB', np.where(rawData['srce'].str.contains('GLOBAL MERCHANT|GMS'),'GMS', rawData['srce']))
    • @siddheshtiwari:我想试试吧。否则提出问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2020-05-25
    • 1970-01-01
    • 2018-07-23
    • 2017-02-25
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多