【问题标题】:Use regular expression to extract elements from a pandas data frame使用正则表达式从 pandas 数据框中提取元素
【发布时间】: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 循环或列表理解?

【问题讨论】:

标签: regex python-3.x pandas series


【解决方案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
      • 它会在我指定我想要捕获它的情况下。在我的原始数据框中,我有一些我想要捕获的参数,因此我不需要复杂的正则表达式。
      猜你喜欢
      • 1970-01-01
      • 2016-09-29
      • 2019-09-30
      • 1970-01-01
      • 2016-03-04
      • 2010-11-27
      • 2021-01-22
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多