栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python-pandas过滤串联的多个子串

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python-pandas过滤串联的多个子串

如果你坚持使用纯熊猫,那么出于性能和实用性的考虑,我认为你应该使用正则表达式来完成此任务。但是,你将需要首先适当地转义子字符串中的任何特殊字符,以确保它们在字面上匹配(并且不用作正则表达式元字符)。

这很容易做到

re.escape

>>> import re>>> esc_lst = [re.escape(s) for s in lst]

然后可以使用正则表达式管道将这些转义的子字符串连接起来|。可以对照字符串检查每个子字符串,直到找到一个匹配项(或它们都已经过测试)。

>>> pattern = '|'.join(esc_lst)

然后,掩蔽阶段将成为遍历各行的单个低级循环:

df[col].str.contains(pattern, case=False)

这是一个简单的设置,可以让你感受到性能:

from random import randint, seedseed(321)# 100 substrings of 5 characterslst = [''.join([chr(randint(0, 256)) for _ in range(5)]) for _ in range(100)]# 50000 strings of 20 charactersstrings = [''.join([chr(randint(0, 256)) for _ in range(20)]) for _ in range(50000)]col = pd.Series(strings)esc_lst = [re.escape(s) for s in lst]pattern = '|'.join(esc_lst)

提出的方法大约需要1秒(因此,一百万行最多可能需要20秒):

%timeit col.str.contains(pattern, case=False)1 loop, best of 3: 981 ms per loop

使用相同的输入数据,问题中的方法花费了大约5秒钟。

值得注意的是,在没有匹配的情况下,这些时间是“最坏的情况”(因此检查了所有子字符串)。如果有比赛,则计时会有所改善。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456370.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号