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

如何在Pandas中高效实现分组后基于最大值获取对应列值(替代Groupby+Join方法)

高效实现分组取最大值对应列的方法(使用transform)

当然可以用transform方法来实现这个需求,而且相比分组后合并的方式,它更简洁高效,不需要额外的合并操作,直接在原DataFrame上完成计算。下面给你两种实用的实现方式:

方法一:结合idxmax与transform

这种方法直接定位每组中Max Speed最大值的位置,然后提取对应的Tmp值并广播到组内所有行:

import pandas as pd

# 构建示例DataFrame
df = pd.DataFrame({
    'Animal': ['Falcon', 'Falcon', 'Parrot', 'Parrot'],
    'Habitat':['Jungle', 'Jungle', 'Sky', 'Sky'],
    'Tmp':['A', 'B', 'C', 'D'],
    'Max Speed': [380., 370., 24., 26.]
})

# 添加Output列
df['Output'] = df.groupby(['Animal', 'Habitat'])['Max Speed'].transform(
    lambda x: df.loc[x.idxmax(), 'Tmp']
)

原理说明:

  • x.idxmax()会返回当前分组内Max Speed最大值所在的行索引
  • df.loc[x.idxmax(), 'Tmp']提取该索引对应的Tmp值
  • transform会把这个值自动广播到分组内的每一行,实现整组统一赋值

方法二:先排序再分组取首值

如果你的数据集较大,这种方法可能性能更优,因为排序后分组取首值的操作更高效:

# 先按分组键和Max Speed降序排序,确保每组最大值排在最前面
df_sorted = df.sort_values(['Animal', 'Habitat', 'Max Speed'], ascending=False)
# 分组后取每组第一个Tmp值并广播到所有行
df['Output'] = df_sorted.groupby(['Animal', 'Habitat'])['Tmp'].transform('first')

原理说明:

  • 排序后,每组内Max Speed最大的行排在组的首位
  • transform('first')会把每组的第一个Tmp值广播到组内所有行,实现需求

最终输出结果

两种方法都会得到你期望的结果:

Animal Habitat Tmp  Max Speed Output
0  Falcon  Jungle   A      380.0      A
1  Falcon  Jungle   B      370.0      A
2  Parrot    Sky   C       24.0      D
3  Parrot    Sky   D       26.0      D

相比分组后合并的方式,transform方法不需要创建中间的分组结果表,也不需要执行合并操作,代码更简洁,内存占用更低,在处理大规模数据时优势更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:44:05