在熊猫数据框中使用正则表达式替换列值

Posted

技术标签:

【中文标题】在熊猫数据框中使用正则表达式替换列值【英文标题】: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数据框中进行这种类型的字符串匹配。

【问题讨论】:

【参考方案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使用时中断。

以上是关于在熊猫数据框中使用正则表达式替换列值的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式删除熊猫数据框中的子字符串

如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?

使用python正则表达式用字符串的小数部分替换数据框列值

如何使用选择性正则表达式在熊猫系列中执行替换?

通过正则表达式将熊猫列替换为自身的一个子集

使用正则表达式从 pandas 数据框中提取元素