使用正则表达式从 pandas 数据框中提取元素
Posted
技术标签:
【中文标题】使用正则表达式从 pandas 数据框中提取元素【英文标题】:Use regular expression to extract elements from a pandas data frame 【发布时间】:2019-06-02 06:35:02 【问题描述】:来自以下数据框:
d = 'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']
df = pd.DataFrame.from_dict(d)
我的最终目标是提取熊猫系列中的字母 a、b 或 c(作为字符串)。为此,我使用了re
模块中的.findall()
方法,如下所示:
# import the module
import re
# define the patterns
pat = 'a|b|c'
# extract the patterns from the elements in the specified column
df['col1'].str.findall(pat)
问题是输出,即每行中的字母 a、b 或 c,将出现在 list(单个元素)中,如下所示:
Out[301]:
0 [a]
1 [b]
2 [c]
3 [a]
虽然我希望将字母 a、b 或 c 作为字符串,如下所示:
0 a
1 b
2 c
3 a
我知道如果我将re.search()
与.group()
结合起来,我可以得到一个字符串,但如果我这样做了:
df['col1'].str.search(pat).group()
我将收到以下错误消息:
AttributeError: 'StringMethods' object has no attribute 'search'
使用.str.split()
不会完成这项工作,因为在我的原始数据帧中,我想捕获可能包含分隔符的字符串(例如,我可能想捕获a-b
)
有没有人知道一个简单的解决方案,也许可以避免迭代操作,例如 for 循环或列表理解?
【问题讨论】:
你试过这个:pandas.pydata.org/pandas-docs/stable/generated/… 吗? 【参考方案1】:将extract 与捕获组一起使用:
import pandas as pd
d = 'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']
df = pd.DataFrame.from_dict(d)
result = df['col1'].str.extract('(a|b|c)')
print(result)
输出
0
0 a
1 b
2 c
3 a
【讨论】:
【参考方案2】:修复你的代码
pat = 'a|b|c'
df['col1'].str.findall(pat).str[0]
Out[309]:
0 a
1 b
2 c
3 a
Name: col1, dtype: object
【讨论】:
【参考方案3】:只需像这样尝试str.split() - df["col1"].str.split("-", n = 1, expand = True)
import pandas as pd
d = 'col1':['a-1524112-124', 'b-1515', 'c-584854', 'a-15154']
df = pd.DataFrame.from_dict(d)
df['col1'] = df["col1"].str.split("-", n = 1, expand = True)
print(df.head())
输出:
col1
0 a
1 b
2 c
3 a
【讨论】:
事实上,这对于这个示例示例来说是可行的,但是,在我原来的 df 中,拆分观察不会完成这项工作,因为我想要捕获的内容可能包含-
符号。即我也想捕捉类似a-b
@BCArg 然后编辑您的问题,让我们更多地了解您的 col1 的可能价值是什么?
@BCArg df['col1'].str.findall(pat).str[0]
如何捕获a-b
?
它会在我指定我想要捕获它的情况下。在我的原始数据框中,我有一些我想要捕获的参数,因此我不需要复杂的正则表达式。以上是关于使用正则表达式从 pandas 数据框中提取元素的主要内容,如果未能解决你的问题,请参考以下文章
Python使用提取的正则表达式创建一个新列,直到 \n 从数据框中
如何使用正则表达式从熊猫数据框中的一行中的字符串中提取所有特定值?