python - 在 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对一些评论的回答:
- 我正在寻找完全匹配
- 我已经使用预编译正则表达式
re.compile()
解决方案
在大多数情况下,搜索多个单词的问题与许多搜索词共享相同的前缀有关,并且列表中的此类单词越多,查找匹配所需的回溯步骤越多,这会减慢代码执行。
正则表达式树将在这里拯救,连同单词边界(因为您需要完全匹配)。安装pip install trieregex
和使用
from trieregex import TrieRegEx
keywords = ['item0','item1','item2','item3']
tr = TrieRegEx(*keywords)
pattern = fr'\b({tr.regex()})\b'
然后,您可以使用pattern
with.str.extract()
方法。
如果您不需要使用某些第三方库来生成正则表达式树,则可以使用此 SO post 中的代码。
推荐阅读
- c - 值的数据类型
- django - 如何使用 django-filter 制作具有反向外键值的过滤器?
- linux - 如何通过排除标题根据日期字段对数据进行排序
- prometheus - 如何在grafana图表中隐藏或合并相同的数据字段
- django - DRF + SerializerMethodField 与外键
- angular - 使用 Angular 中的类字段的无限制状态
- c# - 读取 RestSharp 响应并将数据保存到类
- java - 如何使用 xzing java 库生成 UPC 或 EAN 条码
- python - 是否可以将 jupyter 笔记本块设置为在前一个之后延迟运行?
- android-ndk - 未安装 NDK,在 Azure Pipeline 中创建 Android 工件失败