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

如何用Pandas groupby实现反向查找:获取分组最大Time对应的Name

Pandas分组后反向查找最大值对应的记录

需求:在Pandas DataFrame中按Gender和Grade分组,获取每组Time最大值对应的Name或索引。你已经通过df.groupby(["Gender","Grade"])["Time"].max()得到了各组的最大Time值,但不知道如何匹配回原DataFrame中的对应记录。

以下是几种高效的实现方法:

方法1:合并分组结果与原表

先将分组得到的最大值转换为DataFrame,再通过merge关联原表,最后筛选匹配的行:

import pandas as pd
df = {'Name': ['Mike', 'Lilly', 'Frank', 'Jane', 'John', 'Matt', "Alice", "Ben"],
      'Gender': ["M", "F", "M", "F", "M", "M", "F", "M" ],
      'Grade': [10, 10, 11, 11, 10, 11,10,11],
      'Time': [10, 20, 15, 25, 12, 18, 15, 17]}
df = pd.DataFrame(df)

# 转换分组结果为DataFrame并重命名列
max_df = df.groupby(["Gender","Grade"])["Time"].max().reset_index().rename(columns={'Time': 'Max_Time'})
# 关联原表并筛选匹配行
result = pd.merge(df, max_df, on=['Gender', 'Grade'])
result = result[result['Time'] == result['Max_Time']]
# 可选:保留需要的列
result = result[['Name', 'Gender', 'Grade', 'Time']]
print(result)

方法2:使用transform广播组内最大值

通过transform将每组的最大值广播到原表的对应行,直接筛选相等的记录,代码更简洁:

import pandas as pd
df = {'Name': ['Mike', 'Lilly', 'Frank', 'Jane', 'John', 'Matt', "Alice", "Ben"],
      'Gender': ["M", "F", "M", "F", "M", "M", "F", "M" ],
      'Grade': [10, 10, 11, 11, 10, 11,10,11],
      'Time': [10, 20, 15, 25, 12, 18, 15, 17]}
df = pd.DataFrame(df)

# 添加组内最大值列
df['Group_Max_Time'] = df.groupby(['Gender', 'Grade'])['Time'].transform('max')
# 筛选匹配行
result = df[df['Time'] == df['Group_Max_Time']][['Name', 'Gender', 'Grade', 'Time']]
print(result)

方法3:用idxmax直接获取最大值索引

idxmax会返回每组中Time最大值对应的行索引,直接用loc提取原表记录:

import pandas as pd
df = {'Name': ['Mike', 'Lilly', 'Frank', 'Jane', 'John', 'Matt', "Alice", "Ben"],
      'Gender': ["M", "F", "M", "F", "M", "M", "F", "M" ],
      'Grade': [10, 10, 11, 11, 10, 11,10,11],
      'Time': [10, 20, 15, 25, 12, 18, 15, 17]}
df = pd.DataFrame(df)

# 获取每组最大值的索引
max_indices = df.groupby(['Gender', 'Grade'])['Time'].idxmax()
# 提取对应记录
result = df.loc[max_indices][['Name', 'Gender', 'Grade', 'Time']]
print(result)

注意事项

  • 方法3中,如果同一分组内存在多个相同的Time最大值,idxmax只会返回第一个出现的行索引。如果需要保留所有最大值记录,建议使用方法1或方法2。

以上三种方法最终都会输出如下结果:

Name Gender  Grade  Time
0   Mike      M     10    10
1  Lilly      F     10    20
3   Jane      F     11    25
5   Matt      M     11    18

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:22:44