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

