【问题标题】:Find and replace semi-common strings in dataframe?查找和替换数据框中的半常见字符串?
【发布时间】:2019-08-29 19:25:15
【问题描述】:

我正在尝试查找一个半常见的字符串并删除该列中的所有其他数据。 Pandas 和 Re 已导入。例如,我有数据框...

>>>df
COLUMN COUNT   DATA
           1   this row RA-123: data 8b43a
           2   here RA-5372: data 94h63c

我只需要保留 RA-“后面的编号”并删除之前和之后的所有内容。后面的数字并不总是相同的长度,“RA-”字符串并不总是出现在相同的位置。每个实例后面都有一个冒号,可以用作分隔符。

我试过这个(一个朋友为我写了正则表达式搜索,因为我不熟悉它)。

df.assign(DATA= df['DATA'].str.extract(re.search('RA[^:]+')))

但是python返回了

TypeError: search() missing 1 required positional argument: 'string'

我在这里缺少什么?提前致谢!

【问题讨论】:

  • 不需要re,只需将正则表达式传递给extract

标签: python python-3.x regex pandas dataframe


【解决方案1】:

正如我之前提到的,这里不需要re

其他答案很好地解决了如何直接使用extract。但是,要具体回答您,如果您真的想使用re,则可以使用re.compile 而不是re.search

df.assign(DATA= df['DATA'].str.extract(re.compile(regex_str)))

【讨论】:

    【解决方案2】:

    您应该使用带有提取的捕获组:

    df['DATA'].str.extract(r'(RA-\d+)')
    

    这里,(RA-\d+) 是一个匹配 RA 的捕获组,然后是一个连字符,然后是一个或多个数字。

    您可以使用自己的模式,但仍需要使用捕获括号将其包装起来,r'(RA[^:]+)'

    【讨论】:

    • Wiktor,这很好用,这是一个很好的解释。谢谢你。你有没有机会知道我将如何声明一个在标题中有空格的列名(IE:'RA ID')来代替 df.assign 之后的参数? (当前为“DATA=”)
    • 您可以使用我在回答中的方式。 df['RA ID'] = df['DATA'].str.extract(r'(RA-\d+)')
    • 是的,如果您只想将结果分配给新列,请使用df['RA ID'] = df['DATA'].str.extract(r'(RA-\d+)', expand=False) 甚至df['RA ID'] = df['DATA'].str.extract(r'(RA-\d+)', expand=False).fillna('')
    【解决方案3】:

    查看docs,您不需要re.search 方法。你只需拨打df[DATA] = df['DATA'].str.extract(r'RA[^:]+'))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 2011-02-03
      相关资源
      最近更新 更多