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_A | Col_B | Col_C | Cold_D | Score |
|---|---|---|---|---|
| A | B | C | NULL | 4 |
内容的提问来源于stack exchange,提问作者Pedro Alves
相关产品推荐
相关产品推荐

