如何在pandas DataFrame中筛选每个分组对应指定列最大值的行
Pandas按分组取某列最大值对应完整行的实现方法
你需要的是分组内目标列最大值对应的原始行,直接用groupby.max()会对每列单独取最大值,和需求不符,以下是几种常用实现方案:
方法1:groupby.idxmax()(仅返回每组第一个最大值行)
如果每组只有一个最大值,或者只需要第一个出现的最大值行,用这个方法最便捷:
# 按[Make, Model]分组,提取每组Customer Rating最大值对应的行索引 max_idx = df.groupby(['Make', 'Model'])['Customer Rating'].idxmax() # 用索引筛选原DataFrame的完整行 result = df.loc[max_idx]
特点:逻辑简单效率高,遇到并列最大值时仅返回第一个出现的行。
方法2:groupby.transform()(返回分组内所有最大值行)
如果需要保留同一分组内所有并列最大值的行,用这个方案:
# 生成与原表长度一致的序列,每个位置对应所在分组的Customer Rating最大值 group_max = df.groupby(['Make', 'Model'])['Customer Rating'].transform('max') # 筛选原表中Customer Rating等于分组最大值的行 result = df[df['Customer Rating'] == group_max]
特点:所有符合最大值条件的行都会被保留,适合存在并列极值的场景。
方法3:排序+去重(逻辑直观,支持自定义排序规则)
如果需要额外自定义排序逻辑来决定并列最大值时保留哪一行,可以用这个方案:
# 先按分组列升序、Customer Rating降序排序,确保每个分组的最大值行排在最前 sorted_df = df.sort_values(by=['Make', 'Model', 'Customer Rating'], ascending=[True, True, False]) # 按分组列去重,保留第一个出现的行(即最大值行) result = sorted_df.drop_duplicates(subset=['Make', 'Model'], keep='first')
示例运行结果
用你提供的测试数据,以上方法返回的结果如下:
| 索引 | Owner | Make | Model | Max Speed | Customer Rating |
|---|---|---|---|---|---|
| 0 | Bob | Ford | Bronco | 80 | 90 |
| 3 | Steve | Ford | Model T | 45 | 75 |
| 4 | Kelly | Jeep | Wrangler | 72 | 99 |
内容的提问来源于stack exchange,提问作者Alex P
相关产品推荐
相关产品推荐

