在pandas数据帧中使用正则表达式匹配组的性能



我有一个约350k行的panda系列,我想应用panda。Series.str.extract函数使用由约100个子字符串组成的正则表达式,例如:

'(item0|item1|item2|item3|item4|item5|item6|item7|item8|item9|item10|item11|item12|item13|item14|item15|item16|item17|item18|item19|item20|item21|item22|item23|item24|item25|item26|item27|item28|item29|item30|item31|item32|item33|item34|item35|item36|item37|item38|item39|item40|item41|item42|item43|item44|item45|item46|item47|item48|item49|item50|item51|item52|item53|item54|item55|item56|item57|item58|item59|item60|item61|item62|item63|item64|item65|item66|item67|item68|item69|item70|item71|item72|item73|item74|item75|item76|item77|item78|item79|item80|item81|item82|item83|item84|item85|item86|item87|item88|item89|item90|item91|item92|item93|item94|item95|item96|item97|item98|item99|item100)'

提取太慢:在我的jupyter笔记本(Python 3.9(中需要1分钟。为什么它这么慢?如何加快速度?

Edit 1我使用了"itemX"作为示例,但它可以被任何子字符串替换。正则表达式可能类似

'(carrageenan|dihydro|basketball|etc...)'

编辑2对一些评论的回答:

  • 我正在寻找精确的匹配
  • 我已经使用re.compile()预编译正则表达式

在大多数情况下,搜索多个单词的问题与许多搜索单词共享同一前缀有关,并且列表中的此类单词越多,查找匹配项所需的回溯步骤就越多,这会减慢代码执行速度。

正则表达式trie和单词边界(因为你需要一个精确的匹配(将在这里起到拯救作用。安装pip install trieregex并使用

from trieregex import TrieRegEx
keywords = ['item0','item1','item2','item3']
tr = TrieRegEx(*keywords)
pattern = fr'b({tr.regex()})b'

然后,可以使用pattern.str.extract()方法。

如果您不需要使用某些第三方库来生成regex-trie,则可以使用本SO文章中的代码。

最新更新