【问题标题】:Removing strings that match multiple regex patterns from pandas series从熊猫系列中删除与多个正则表达式模式匹配的字符串
【发布时间】:2016-12-02 14:29:09
【问题描述】:

我有一个 Pandas 数据框列,其中包含需要清除匹配各种正则表达式模式的字符串的文本。我当前的尝试(如下所示)循环遍历每个模式,创建一个包含匹配项(如果找到)的新列,然后循环遍历数据框,在找到的匹配项处拆分列。然后我删除不需要的匹配列“re_match”。

虽然这适用于我当前的用例,但我不禁认为在 pandas 中必须有一种更有效的矢量化方式来执行此操作,而无需使用 iterrows() 并创建一个新列。我的问题是,有没有更优化的方法从列中删除匹配多个正则表达式模式的字符串?

在我当前的用例中,不需要的字符串始终位于文本块的末尾,因此使用split(...)[0]。但是,如果可以从文本中的任何点提取不需要的字符串,那就太好了。

另外,请注意,将正则表达式组合成一个长的单一模式是不可取的,因为有数十种模式会定期更改。

df = pd.read_csv('data.csv', index_col=0)
patterns = [
    '( regex1 \d+)',
    '((?: regex 2)? \d{1,2} )',
    '( \d{0,2}.?\d{0,2}-?\d{1,2}.?\d{0,2}regex3 )',
]

for p in patterns:

    df['re_match'] = df['text'].str.extract(
        pat=p, flags=re.IGNORECASE, expand=False
    )
    df['re_match'] = df['re_match'].fillna('xxxxxxxxxxxxxxx')

    for index, row in df.iterrows():
        df.loc[index, 'text'] = row['text'].split(row['re_match'])[0]

df = df.drop('re_match', axis=1)

感谢您的帮助

【问题讨论】:

  • 我不熟悉pandas,但据我了解,这里的问题可能来自名为dataframe的数据结构。克服此任务的简单方法可能是使用纯 python 或 sed。

标签: regex python-3.x pandas data-cleaning


【解决方案1】:

确实有,叫df.applymap(some_function)
考虑以下示例:

from pandas import DataFrame
import pandas as pd, re
df = DataFrame({'key1': ['1000', '2000'], 'key2': ['3000', 'digits(1234)']})

def cleanitup(val):
    """ Multiplies digit values """
    rx = re.compile(r'^\d+$')
    if rx.match(val):
        return int(val) * 10
    else:
        return val

# here is where the magic starts
df.applymap(cleanitup)

显然,我编造了,但现在在每个以前只有位数字的单元格中,这些数字都乘以 10,其他所有值都保持不变。
考虑到这一点,您可以根据需要在函数cleanitup() 中检查和重新排列您的值。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2016-11-18
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多