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,不然会出现连接错配):
这个方案不用改动season_statistics_T1本身的结构,适合后续流程还需要保留其索引结构的场景。tourney_data = pd.merge( tourney_data, season_statistics_T1, left_on=['Season', 'T1_TeamID'], right_index=True, how='left' )
内容的提问来源于stack exchange,提问作者user288609
相关产品推荐
相关产品推荐

