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

Python按分组提取最高分对应行报错:KeyError: 'Score' 求解

问题分析与解决方案

你的问题出在对分组后的结果只筛选了Score列,导致后续操作丢失了其他列信息,而且直接将Series赋值给df后,再访问'Score'列自然会报错(因为此时df是一个Series,不是DataFrame,它的name是'Score',没有列名索引)。

为什么原代码出错?

你执行的代码:

df = df.groupby(['Col_A','Col_B','Col_C'])['Score'].nlargest(1)

这段代码会返回一个多级索引的Series(索引包含分组键+原DataFrame的行索引),值仅为每组Top1的Score值。此时df已经不是原来的DataFrame了,而是一个Series,所以当你后续尝试访问df['Score']时,就会触发KeyError——因为Series没有列名,只有一个name属性。

正确实现方法(保留所有列)

下面提供几种可靠的方法,帮你提取每组中Score最高的完整行:

方法1:使用idxmax() + loc(推荐,效率较高)

idxmax()会返回每组中Score最大值对应的原行索引,再通过loc提取整行数据:

# 获取每组Score最大的行的索引
max_idx = df.groupby(['Col_A', 'Col_B', 'Col_C'])['Score'].idxmax()
# 提取对应行并重置索引
result = df.loc[max_idx].reset_index(drop=True)

方法2:先排序再取每组首行

先按分组键升序、Score降序排序,再分组取第一行:

result = df.sort_values(
    by=['Col_A', 'Col_B', 'Col_C', 'Score'],
    ascending=[True, True, True, False]
).groupby(['Col_A', 'Col_B', 'Col_C']).first().reset_index()

方法3:分组后直接对DataFrame用nlargest

通过apply对每个分组的子DataFrame调用nlargest,保留所有列:

result = df.groupby(
    ['Col_A', 'Col_B', 'Col_C'],
    group_keys=False
).apply(lambda x: x.nlargest(1, 'Score')).reset_index(drop=True)

验证结果

以上三种方法处理你的示例数据后,都会得到期望的结果:

Col_ACol_BCol_CCold_DScore
ABCNULL4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:40:43