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

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列残留的历史赋值,确认浅拷贝的污染问题
修复方案
  1. 每次需要重置处理状态时,用.copy()创建深拷贝,避免修改原始数据
  2. 取值前先判断分组结果中是否存在对应编码,不存在就填充0,避免KeyError
  3. 把阈值和编码的映射做成配置循环处理,消除冗余重复代码

修复后的参考代码:

# 配置阈值和对应编码的映射
# 注意原逻辑里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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:09:28