You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:23:36