如何在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
相关产品推荐
相关产品推荐

