【发布时间】: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