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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:41