如何用Pandas GroupBy获取多列最大值对应的行
获取Pandas分组中多列最大值对应的行
这是个很实用的需求,我来分享两种简洁的实现方式,完全匹配你的要求:
1. 先构造示例数据
首先我们先还原你给出的DataFrame:
import pandas as pd df = pd.DataFrame([ {'grouper': 'a', 'col1': 1, 'col2': 3, 'uniq_id': 1}, {'grouper': 'a', 'col1': 2, 'col2': 4, 'uniq_id': 2}, {'grouper': 'a', 'col1': 3, 'col2': 2, 'uniq_id': 3} ])
2. 方法一:借助临时列快速实现
这种方式直观易懂,适合快速上手:
- 首先给每行新增一个临时列,计算
col1和col2的最大值 - 按
grouper分组后,用idxmax()找到每组中这个临时列最大值对应的行索引 - 最后用索引筛选原DataFrame并移除临时列
# 计算每行col1和col2的最大值 df['max_val'] = df[['col1', 'col2']].max(axis=1) # 找到每组中max_val最大的行的索引,筛选出结果 result = df.loc[df.groupby('grouper')['max_val'].idxmax()] # 移除临时列 result = result.drop('max_val', axis=1)
运行后得到的结果就是你期望的:
col1 col2 grouper uniq_id 1 2 4 a 2
3. 方法二:用groupby.apply直接处理
如果不想新增临时列,可以用apply()对每个分组单独处理,逻辑更紧凑:
def get_max_row(group): # 计算当前分组每行的col1/col2最大值,再找到最大值对应的行索引 max_row_idx = group[['col1', 'col2']].max(axis=1).idxmax() return group.loc[max_row_idx] # 分组应用函数,重置索引让结果更整洁 result = df.groupby('grouper').apply(get_max_row).reset_index(drop=True)
关于平局处理
两种方法中用到的idxmax()函数,在遇到多个行具有相同最大值的情况时,会返回分组中第一个出现的行,完全符合你“平局取组内第一行”的要求。而你实际场景用时间戳的话,因为时间戳是数值型,处理逻辑完全一致,且你提到预计无平局,所以不用担心问题。
内容的提问来源于stack exchange,提问作者user1610719
相关产品推荐
相关产品推荐

