【问题标题】:Replace column values using regex in pandas data frame在熊猫数据框中使用正则表达式替换列值
【发布时间】:2018-04-11 23:23:11
【问题描述】:

我在pandas 数据框中有一列,如下所示。列名是ABC

ABC
Fuel
FUEL
Fuel_12_ab
Fuel_1
Lube
Lube_1
Lube_12_a
cat_Lube

现在我想使用下面的正则表达式替换此列中的值

ABC
Fuel
FUEL
Fuel
Fuel
Lube
Lube
Lube
cat_Lube

我们如何在pandas数据框中进行这种类型的字符串匹配。

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:
    In [63]: df.ABC.str.replace(r'_\d+.*', r'')
    Out[63]:
    0        Fuel
    1        FUEL
    2        Fuel
    3        Fuel
    4        Lube
    5        Lube
    6        Lube
    7    cat_Lube
    Name: ABC, dtype: object
    

    【讨论】:

    • df.ABC.str.split('_\d', 1).str[0]
    • @MaxU 好技巧只是有点怀疑我的专栏是否有Fuel_aa_12 会起作用。
    • @piRSquared,请将其添加为答案! :)
    • 我添加了一个不同的。
    • @New_learner 如果是这种情况,您应该为您的问题添加更多可能的输入。由于您刚刚描述的新输入,这里有 2/3 个答案中断。
    【解决方案2】:

    替换为str.extract:

    df.ABC.str.extract('^(.*?)(?=_\d|$)', expand=False)
    
    0        Fuel
    1        FUEL
    2        Fuel
    3        Fuel
    4        Lube
    5        Lube
    6        Lube
    7    cat_Lube
    Name: ABC, dtype: object
    

    扩展由 piRSquared 提供:

    df.ABC.str.extract('(.*(?<=lube|fuel)).*', re.IGNORECASE, expand=False)
    
    0        Fuel
    1        FUEL
    2        Fuel
    3        Fuel
    4        Lube
    5        Lube
    6        Lube
    7    cat_Lube
    Name: ABC, dtype: object
    

    【讨论】:

    • pd.Series.str.extract 版本df.ABC.str.extract('(.*(?&lt;=lube|fuel)).*', re.IGNORECASE, expand=False)
    • 在查询开头添加^ 使步数减半(180 而非 363)
    • @ctwheels 谢谢,知道这很有趣(添加)。
    【解决方案3】:

    在忽略大小写的情况下对lubefuel 使用正向后视。

    import re
    import pandas as pd
    
    pat = re.compile('(?<=lube|fuel)_', re.IGNORECASE)
    
    df.assign(ABC=[re.split(pat, x, 1)[0] for x in df.ABC])
    
            ABC
    0      Fuel
    1      FUEL
    2      Fuel
    3      Fuel
    4      Lube
    5      Lube
    6      Lube
    7  cat_Lube
    

    【讨论】:

    • _\d 使用 19 步而不是 51 步
    • @ctwheels 这样更好吗?:re.compile('(?&lt;=lube|fuel)_.*', re.IGNORECASE)
    • 你坚持你刚刚评论的那个,OP在MaxU's answer下面的评论中添加了新的输入,这导致其他答案在\d使用时中断。
    猜你喜欢
    • 2018-02-22
    • 2017-05-19
    • 2020-10-23
    • 2021-05-16
    • 1970-01-01
    • 2021-03-13
    • 2018-02-20
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多