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

优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:15:39