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

如何在Pandas中对每个ID向量化函数?优化循环耗时问题

高效向量化解决方案:替代循环实现按ID分组求最大值

嘿,我明白你现在遇到的性能瓶颈了——手动循环处理分组数据确实会拖慢速度,尤其是数据量较大时CPU占用会飙升。别担心,Pandas本身就提供了完全向量化的分组操作,根本不需要写循环!

核心方案:groupby() + transform()

Pandas的groupby()配合transform()是专门解决这类需求的神器:它会将分组计算的结果自动广播回原DataFrame的每一行,既保证了每个ID对应的所有行都显示该组的最大值,又完全基于底层优化的向量化逻辑运行,性能远超Python循环。

直接可用的代码示例

import pandas as pd
import numpy as np

# 你的示例DataFrame(补全数值列)
compare_table = pd.DataFrame({
    'id': [1,1,1,2,2,3,3,3],
    'day#': [1, 2, 3, 1, 2, 1, 2, 3],
    'value': [5, 8, 3, 2, 7, 10, 4, 6]  # 假设这是需要取最大值的数值列
})

# 新增列:每个ID对应的最大值,所有行保持一致
compare_table['max_value'] = compare_table.groupby('id')['value'].transform('max')

为什么这方案更优?

  • 无循环纯向量化:底层基于Pandas/NumPy的C级优化实现,比Python循环快数倍甚至数十倍,CPU占用大幅降低
  • 自动对齐索引:transform会自动将分组结果匹配回原DataFrame的每一行,无需手动处理索引映射或合并逻辑
  • 兼容缺失值:如果数值列存在NaN,transform('max')会自动忽略缺失值,和NumPy的max行为保持一致

运行效果示例

执行后你的DataFrame会变成这样:

idday#valuemax_value
1158
1288
1338
2127
2277
311010
32410
33610

备选等价方案(仅作参考)

如果你想了解其他实现方式,也可以先计算每个ID的最大值,再通过map合并到原表,但transform是最简洁高效的选择:

# 先计算每个ID的最大值
max_per_id = compare_table.groupby('id')['value'].max()
# 映射回原表
compare_table['max_value'] = compare_table['id'].map(max_per_id)

内容的提问来源于stack exchange,提问作者Garrett Eickelberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:22:35