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

