Python中在300万条DataFrame记录里高效搜索子字符串的方法
高效筛选包含任一子字符串的DataFrame行
嘿,你这个嵌套循环的思路确实会导致天文数字级的迭代次数(5000×300万=150亿次),完全是性能黑洞!咱们换用Pandas的向量化操作+正则表达式合并的方案,能把速度提升几个数量级,具体做法如下:
核心思路
把所有子字符串合并成一个单一的正则表达式模式,然后用Pandas原生的str.contains()方法一次性对整个description列进行匹配——这个方法是底层用C实现的向量化操作,比Python层面的逐行逐子串循环高效太多。
具体代码实现
import re import pandas as pd # 假设你的子字符串集合是searchstring列表 # 先转义每个子串里的正则特殊字符(比如.、*、?等),避免匹配出错 escaped_substrings = [re.escape(ss) for ss in searchstring] # 用|把所有子串拼接成一个正则模式,意思是"匹配任一子串" pattern = '|'.join(escaped_substrings) # 用str.contains筛选,case=False自动忽略大小写,不用手动转lower() # na=False是把空值排除,避免匹配出错 filtered_df = df[df['description'].str.contains(pattern, case=False, na=False)]
为什么这个方法快?
- 向量化操作:
str.contains()直接对整个Series(列)进行处理,不需要逐行遍历,Pandas会自动优化底层计算。 - 单次正则匹配:合并成一个正则模式后,正则引擎只需要遍历每个字符串一次,就能完成所有子串的匹配,而不是对每个子串都遍历一次整个列。
额外优化建议
如果你的子字符串集合特别大(比如超过1万),可以考虑:
- 先对重复的子串去重,减少正则模式的长度
- 如果内存紧张,用
df.chunk()分块处理后再合并结果
内容的提问来源于stack exchange,提问作者Manu Mohan
相关产品推荐
相关产品推荐

