如何优化Pandas匹配筛选逻辑 缩短3万行表格超3小时的处理时长
Pandas 遍历过滤代码优化方案
最优优化代码
仅需2行即可实现完全相同的逻辑,运行耗时可从3小时降至100毫秒以内:
# 过滤保留df中product_code存在于dj.product_numb中的行 df = df[df['product_code'].isin(dj['product_numb'])]
如果dj的体量较大,可提前将目标列转成集合进一步提升匹配效率:
target_set = set(dj['product_numb']) df = df[df['product_code'].isin(target_set)]
原代码耗时极高的核心原因
- 行级Python循环开销大:
iteritems()是纯Python实现的逐行遍历,没有用到Pandas底层C实现的矢量化计算能力,性能比内置操作低2~3个数量级 - 匹配逻辑重复计算:每次执行
item in dj['product_numb'].values都会全量遍历一次dj的product_numb列,整体时间复杂度达到O(n*m),3万行df的场景下累计运算量超过亿次 - 频繁生成DataFrame副本:循环内每次执行
df.drop(idx)都会复制生成全新的DataFrame对象,3万行600列的表单次复制开销就很高,循环3万次的累计开销极其夸张
多字段匹配场景扩展方案
如果后续需要基于多个字段做匹配过滤,可以用内连接实现,逻辑更清晰:
# 基于product_code和product_numb的匹配保留对应行 df = df.merge( dj[['product_numb']], left_on='product_code', right_on='product_numb', how='inner' ).drop(columns='product_numb')
如果dj存在重复的匹配字段值,可提前对dj做去重处理避免结果出现重复行:dj = dj.drop_duplicates('product_numb')
内容的提问来源于stack exchange,提问作者FlaskyPG
相关产品推荐
相关产品推荐

