DataFrame分组后如何获取所有最大值对应的索引?
问题原因分析
你当前使用的idxmax()方法有个关键特点——它只会返回每组中第一个出现最大值的索引,所以x组里两个值为12的行,它只取了第一个(索引0),漏掉了同样是最大值的索引1,这就是结果不符合预期的核心原因。
解决方案
要获取每组所有最大值对应的索引,我们可以先找出每组的最大值,再筛选原DataFrame中所有等于对应组最大值的行,最后提取需要的信息。这里有两种实现方式:
方法一:分步实现(逻辑更清晰)
import pandas as pd df = pd.DataFrame({'C1': ["x", "x", "x", "y", "y", "y"],'C3': [12, 12, 7, 3, 6, 9]}) # 1. 计算每个C1分组对应的C3最大值 group_max_values = df.groupby('C1')['C3'].max() # 2. 把每个行的C1映射到对应的组最大值,筛选出C3等于该值的行 max_rows = df[df['C3'] == df['C1'].map(group_max_values)] # 3. 提取索引和C1列,整理成你需要的格式 result = max_rows.reset_index().rename(columns={'index': 'max_'})[['C1', 'max_']] print(result)
输出结果:
C1 max_ 0 x 0 1 x 1 2 y 5
方法二:用transform简化代码
transform('max')会把每组的最大值广播到该组的每一行,这样我们可以直接做比较筛选,代码更紧凑:
import pandas as pd df = pd.DataFrame({'C1': ["x", "x", "x", "y", "y", "y"],'C3': [12, 12, 7, 3, 6, 9]}) result = df[df['C3'] == df.groupby('C1')['C3'].transform('max')]\ .reset_index()\ .rename(columns={'index': 'max_'})\ [['C1', 'max_']] print(result)
这段代码的效果和方法一完全一致,只是用transform省去了单独构建映射的步骤。
内容的提问来源于stack exchange,提问作者laivetta
相关产品推荐
相关产品推荐

