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

使用pandas两次groupby取最大值求各州每年选举获胜方报KeyError如何解决

错误原因分析

你抛出KeyError: state以及代码无法运行的问题有三个核心诱因:

  • 链式调用groupby逻辑错误:第一次执行groupby('year')后,返回的分组对象仅以year为分组键,原数据的state字段已经不是当前分组对象可直接识别的顶层字段,第二次调用groupby('state')自然找不到对应字段,触发键报错
  • 语法使用错误:max是分组对象的可调用方法,需要加括号执行,你写的max['totalvotes']属于语法错误,无法正常执行
  • 逻辑存在漏洞:仅取totalvotes的最大值只能拿到得票数值,无法直接匹配到对应得票最高的候选人完整行,拿不到你需要的党派归属信息
正确实现方案

推荐用排序+去重的方案,逻辑清晰不易出错,最终得到的winner_df就是你需要的每年每个州的获胜者完整数据:

import matplotlib
import pandas as pd
import numpy as np
import seaborn as sns

data = pd.read_csv('1976-2020-president.csv')
# 按年份、州升序,得票数降序排序,每个分组的第一条就是该州当年得票最高的候选人
data_sorted = data.sort_values(by=['year', 'state', 'totalvotes'], ascending=[True, True, False])
# 按年份、州去重,保留第一条数据即为获胜者行
winner_df = data_sorted.drop_duplicates(subset=['year', 'state'], keep='first')

# 验证结果行数是否符合预期
print(winner_df.shape)

如果你更倾向用groupby实现,可通过取最大值索引的方式拿到完整行:

# 取每个年/州分组下得票数最高的行索引
winner_idx = data.groupby(['year', 'state'])['totalvotes'].idxmax()
# 按索引取行得到获胜者数据
winner_df = data.loc[winner_idx]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:54:02