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

pandas合并tourney_data与season_statistics_T1的KeyError: 'Season'报错

报错核心成因

执行merge时抛出的KeyError: 'Season',本质是season_statistics_T1里视觉上看到的「Season」字段不是普通数据列,而是该DataFrame的行索引(绝大多数情况是MultiIndex多层索引的其中一层)。
pandas在Jupyter这类交互式环境里展示DataFrame时,会把索引层级的内容和普通列并排显示,视觉上和普通列没有任何区别,很容易让人误以为这些字段是独立列。但merge操作默认只会在普通数据列里查找指定的连接键,.to_dict()方法默认也只把普通列作为返回字典的键,因此在实际调用时就会抛出KeyError。

快速定位验证

运行两行代码就能确认问题:

  • 执行print(season_statistics_T1.columns.tolist()),输出的列名列表里找不到'Season'
  • 执行print(season_statistics_T1.index.names),返回的索引层级名称里会同时出现'Season'和'T1_TeamID'

这种结构基本都是前期对数据做groupby聚合时,没加as_index=False参数,导致分组字段被自动设为行索引形成的。

两种可落地的解决方法

根据后续流程的需求,可以选择适配的方案:

  • 方案1:把索引层级的字段重置为普通列,适配原本的merge逻辑
    在执行merge之前,先运行一行代码把所有索引层级转成普通列:
    season_statistics_T1 = season_statistics_T1.reset_index()
    执行完成后,原来藏在索引里的字段就会变成普通数据列,此时直接运行原有merge代码就能正常执行。
  • 方案2:不改动原表结构,直接指定用右侧表的索引做连接
    调整merge的参数,指定右侧表直接用自身的MultiIndex完成匹配(必须保证索引层级顺序和左侧连接列顺序完全对应,也就是第一层索引是Season,第二层是T1_TeamID,不然会出现连接错配):
    tourney_data = pd.merge(
        tourney_data,
        season_statistics_T1,
        left_on=['Season', 'T1_TeamID'],
        right_index=True,
        how='left'
    )
    
    这个方案不用改动season_statistics_T1本身的结构,适合后续流程还需要保留其索引结构的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 08:36:04