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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:38:04