如何在Pandas中按col_a分组后筛选每组col_b最大值对应的行?
问题分析
你之前的代码错误地将col_a和col_b同时作为分组键,这会让每个(col_a, col_b)组合单独成为一组,自然会返回所有col_b的值,完全不符合“按col_a分组,提取每组内col_b最大的行”的需求。
解决方案
以下是三种可行的实现方式,注意:如果col_b是字符串类型(如示例中的"01"),直接比较字典序即可匹配数值大小;若实际场景中col_b的字符串格式不满足字典序等于数值序(比如"10"和"2"),需先执行df['col_b'] = df['col_b'].astype(int)转换为数值类型再操作。
方法1:groupby + transform 筛选
先按col_a分组计算每组col_b的最大值,再筛选出col_b等于该最大值的行:
max_b_per_a = df.groupby('col_a')['col_b'].transform('max') result = df[df['col_b'] == max_b_per_a]
方法2:groupby + idxmax 提取行索引
通过idxmax获取每组col_b最大值对应的行索引,再用loc提取目标行:
idx = df.groupby('col_a')['col_b'].idxmax() result = df.loc[idx]
方法3:排序后去重
先按col_a升序、col_b降序排序,再保留每个col_a的第一行:
result = df.sort_values(['col_a', 'col_b'], ascending=[True, False]).drop_duplicates('col_a')
以上三种方法都能得到你需要的结果:
| col_a | col_b | col_c |
|---|---|---|
| 1 | 04 | 425 |
| 2 | 03 | 56 |
| 3 | 02 | 567 |
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

