Python3 pandas分组统计时触发KeyError:1034报错求助
问题根因
报错核心是两个代码逻辑问题共同导致的:
- 浅拷贝引发的数据污染:代码中每次写
mdfm1 = mdfm只是给原始DataFrame起了别名,没有创建独立副本,所有对mdfm1的列修改都会直接改到原始mdfm上。你预期每次赋值exceeded前数据都是初始状态(exceeded为空串),实际上之前赋值的1033等值会一直残留在数据里。 - 分组键缺失触发KeyError:当遍历到某个月份时,没有任何一条记录的风速大于22,你给
exceeded列赋值1034的操作根本没有匹配到任何行,groupby('exceeded').sum()生成的结果索引里完全不存在1034这个值,直接用.loc[1034]取值就会抛KeyError。
注:你以为1035的逻辑能正常执行,实际上代码在1034取值那行就已经中断,根本没有运行到1035的处理逻辑。
排查步骤
- 在1034对应的分组代码后加
print(mdfm1.index),执行后就能看到当前月份分组后的所有exceeded值,确认1034是否真的存在 - 在给exceeded赋值1034前加
print(mdfm['windspeed'].max()),确认当月最大风速是否超过22,判断是不是没有符合阈值的记录 - 在每次重置mdfm1后加
print(mdfm['exceeded'].unique()),就能看到exceeded列残留的历史赋值,确认浅拷贝的污染问题
修复方案
- 每次需要重置处理状态时,用
.copy()创建深拷贝,避免修改原始数据 - 取值前先判断分组结果中是否存在对应编码,不存在就填充0,避免KeyError
- 把阈值和编码的映射做成配置循环处理,消除冗余重复代码
修复后的参考代码:
# 配置阈值和对应编码的映射 # 注意原逻辑里1035的阈值也是22,如果是笔误可以自行修改 threshold_config = [ (20, 1033), (22, 1034), (22, 1035) ] for mth in month: mdfm = mdf[mdf['month']==mth].copy() mdfm['exceeded'] = "" # 计算当月风速占比 month_total_wind = mdfm['windspeed'].sum() mdfm['percent'] = mdfm['windspeed'] / month_total_wind for thresh, code in threshold_config: # 每次处理都用初始数据的深拷贝,避免污染 process_df = mdfm.copy() # 标记超过阈值的行 process_df.loc[process_df['windspeed'] > thresh, 'exceeded'] = code # 分组求和 group_res = process_df.groupby('exceeded')['percent'].sum() # 取值,不存在则填0 dfwi.loc[code, mth] = group_res.get(code, 0.0)
内容的提问来源于stack exchange,提问作者Jakhanh
相关产品推荐
相关产品推荐

