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

Pandas按Id、Name分组筛选对应最大Value的CaseId

如何在Pandas中按Id和Name分组筛选对应最大Value的CaseId

我来帮你解决这个问题!你想要的是对每个Id和Name的组合,找出对应Value最大的那条完整记录,之前用pivot_table的思路偏了——它是用来生成透视表做聚合统计的,没办法直接帮你筛选出目标行。下面给你两种简单有效的解决方案:

方法一:使用groupby + idxmax

这个方法的核心是先找到每个分组中Value最大的行的索引,再通过索引提取对应行:

import pandas as pd

# 构造你的示例DataFrame
data = {
    'Id': [82, 1558, 82, 1558, 82, 1558, 82, 1558],
    'Name': ['A1', 'A3', 'A1', 'A3', 'A1', 'A3', 'A1', 'A3'],
    'CaseId': ['case1.01', 'case1.01', 'case1.06', 'case1.06', 'case1.11', 'case1.11', 'case1.16', 'case1.16'],
    'Value': [37.71, 27.71, 29.54, 29.54, 12.09, 32.09, 33.35, 33.35]
}
df = pd.DataFrame(data)

# 按Id和Name分组,获取每个组中Value最大的行的索引
max_row_indices = df.groupby(['Id', 'Name'])['Value'].idxmax()

# 通过索引提取目标行,并重置索引
result = df.loc[max_row_indices].reset_index(drop=True)

print(result)

运行后会输出你期望的结果:

Id Name    CaseId  Value
0    82   A1  case1.01  37.71
1  1558   A3  case1.16  33.35

方法二:使用sort_values + drop_duplicates

如果你需要更灵活地处理(比如遇到多个相同最大值时选择保留第一条还是最后一条),可以先按Value降序排序,再保留每个分组的第一条记录:

result = df.sort_values(
    by=['Id', 'Name', 'Value'],
    ascending=[True, True, False]  # 按Id、Name升序,Value降序
).drop_duplicates(
    subset=['Id', 'Name'],
    keep='first'  # 保留每个分组的第一条(即Value最大的那条),若要最后一条可改为'last'
).reset_index(drop=True)

这个方法的输出和方法一完全一致,优势是逻辑直观,容易调整规则。

为什么你的原代码不对?

你之前用的pivot_table是把CaseId作为列,对每个(Id, Name)分组下的Value取最大值,最终得到的是一个以CaseId为列的透视表,而不是筛选出单条最大Value的完整记录,所以不符合你的需求。

内容的提问来源于stack exchange,提问作者Zanam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:55