【发布时间】: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数据框中进行这种类型的字符串匹配。
【问题讨论】:
我在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数据框中进行这种类型的字符串匹配。
【问题讨论】:
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]
Fuel_aa_12 会起作用。
替换为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)
在忽略大小写的情况下对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 步
re.compile('(?<=lube|fuel)_.*', re.IGNORECASE)
\d使用时中断。