在熊猫数据框中使用正则表达式替换列值
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('(.*(?<=lube|fuel)).*', re.IGNORECASE, expand=False)
在查询开头添加^
使步数减半(180 而非 363)
@ctwheels 谢谢,知道这很有趣(添加)。【参考方案3】:
在忽略大小写的情况下对lube
或fuel
使用正向后视。
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('(?<=lube|fuel)_.*', re.IGNORECASE)
你坚持你刚刚评论的那个,OP在MaxU's answer下面的评论中添加了新的输入,这导致其他答案在\d
使用时中断。以上是关于在熊猫数据框中使用正则表达式替换列值的主要内容,如果未能解决你的问题,请参考以下文章