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
相关产品推荐
相关产品推荐

