首页 > 解决方案 > 在 pandas 数据框中使用正则表达式匹配组的性能

问题描述

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

'(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 notebook (Python 3.9) 中需要 1 分钟。为什么这么慢以及如何加快速度?

编辑 1我以“itemX”为例,但它可以被任何子字符串替换。正则表达式可能类似于

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

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

标签: pythonregexpandasperformance

解决方案


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

则表达式树将在这里拯救,连同单词边界(因为您需要完全匹配)。安装pip install trieregex和使用

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

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

如果您不需要使用某些第三方库来生成正则表达式树,则可以使用此 SO post 中的代码


推荐阅读