Pandas DataFrame按列表值模糊匹配行的高效优化方案
高效实现Pandas大规模数据模糊匹配筛选
核心优化思路
你当前的循环+concat方案在数据量和匹配列表规模上升时性能拉胯,本质是重复执行布尔索引和内存拼接操作。最优解法是将多个匹配关键词合并为单个正则表达式,仅执行一次模糊匹配,把时间复杂度从O(n*m)压到O(n)(n为DataFrame行数,m为匹配列表长度)。
优化代码实现
基础版:正则合并一次性匹配
import pandas as pd infile = "input.csv" df = pd.read_csv(infile) names_like = ['Ram', 'Nar'] # 把匹配列表拼接成正则"或"模式 match_pattern = '|'.join(names_like) # 单次筛选所有符合条件的行 df_res = df[df['NAME'].str.contains(match_pattern, na=False)] # 可选:若存在同一行匹配多个关键词的情况,去重保留唯一行 df_res = df_res.drop_duplicates() print(f"df_res=\n{df_res}")
进阶版:预编译正则提升性能
如果匹配列表达到数千级,预编译正则能进一步加快匹配速度:
import re import pandas as pd infile = "input.csv" df = pd.read_csv(infile) names_like = ['Ram', 'Nar'] # 预编译正则表达式 match_pattern = re.compile('|'.join(names_like)) df_res = df[df['NAME'].str.contains(match_pattern, na=False)] print(f"df_res=\n{df_res}")
效果说明
- 两种方案都只对
NAME列做一次遍历,避免了循环中重复的DataFrame切片和拼接操作,百万级数据+千级匹配列表的场景下,性能会有数量级的提升。 - 输出结果与你原代码完全一致,且自动避免了重复行(原代码中若某行匹配多个关键词会被多次concat,这里仅保留一次,若需要保留重复可去掉
drop_duplicates)。
示例输出
df_res= NAME AGE 1 Rameshwar 60 3 Naren 60 5 Ramesh 55 6 Narendra 85 8 Ram 85 10 Naresh 86 12 Ramendra 80
内容的提问来源于stack exchange,提问作者Swap
相关产品推荐
相关产品推荐

