优化Pandas偶数匹配逻辑:避免N×M迭代提升大数量级处理性能
优化Pandas循环处理性能问题
问题背景
现有Pandas DataFrame如下:
import pandas as pd df = pd.DataFrame({"letter":['A','B','D','E','G','W','G','M','E','Q'],"value":[1,6,4,0,9,7,0,-1,5,3]})
以及名称-数值列表:
items = [['John',1],['Mike',8],['Jessica',4]]
需求是将DataFrame中满足「value与item的value之和为偶数」的letter追加到对应item中。原有实现采用循环+apply逐行判断,在DataFrame有5万行、items有100个的场景下,会产生50万次迭代,性能极差。
核心逻辑优化
两个数之和为偶数的本质是两数奇偶性相同(同为奇数或同为偶数)。基于这个规律,我们可以提前对DataFrame做一次分组预处理,避免重复遍历整个DataFrame。
优化实现代码
import pandas as pd df = pd.DataFrame({"letter":['A','B','D','E','G','W','G','M','E','Q'],"value":[1,6,4,0,9,7,0,-1,5,3]}) items = [['John',1],['Mike',8],['Jessica',4]] # 预处理:按value的奇偶性分组,收集对应的letter列表 odd_letters = df[df['value'] % 2 != 0]['letter'].tolist() even_letters = df[df['value'] % 2 == 0]['letter'].tolist() # 遍历items直接匹配对应分组 for item in items: v = item[1] if v % 2 != 0: item.append(odd_letters.copy()) # 用copy避免后续修改影响原列表 else: item.append(even_letters.copy()) # 输出结果 for res in items: print(res)
结果验证
运行后得到与原有实现一致的正确结果:
['John', 1, ['A', 'G', 'W', 'M', 'E', 'Q']] ['Mike', 8, ['B', 'D', 'E', 'G']] ['Jessica', 4, ['B', 'D', 'E', 'G']]
性能提升说明
原有方案时间复杂度为O(N*M)(N为DataFrame行数,M为items数量),优化后时间复杂度降至O(N+M):
- 仅需遍历一次DataFrame完成分组(O(N))
- 遍历items仅做简单的奇偶判断和列表追加(O(M))
在5万行+100个items的场景下,处理次数从50万次降到50100次,性能提升显著。
内容的提问来源于stack exchange,提问作者ProcolHarum
相关产品推荐
相关产品推荐

