pandas读取Excel执行pingouin.anova触发KeyError报错排查
问题根因
触发KeyError: 'Cognitive Reattribution'的核心原因是pandas读取anovacogret.xlsx生成的DataFrame中,不存在和代码传入名称完全一致的列。同一份代码在其他表格可正常运行,说明逻辑本身无问题,当前文件的列名和预期存在偏差,常见诱因包括:
- 列名首尾带有不可见空白字符(末尾空格、制表符等,手动编辑Excel表头时极易出现该问题)
- 列名中间的空格数量不匹配(比如实际是两个空格,代码里写了一个)
- Excel文件前存在空行/备注行,pandas默认将第一行识别为表头,导致真实列名整体偏移
- 列名存在大小写、全角半角字符的细微差异
快速排查方法
读取文件后先打印所有列名的原始表示,即可直接定位列名不匹配的具体原因:
import pandas as pd df = pd.read_excel('anovacogret.xlsx') # 输出列名的原始字符串形式,可直接看到隐藏的空白、特殊字符 print([repr(col) for col in df.columns])
比如输出中如果出现'Cognitive Reattribution ',就说明列名末尾多了一个多余空格,和代码中传入的名称无法匹配。
解决方案
根据排查结果选择对应处理方式即可:
- 通用适配方案(无需手动修改Excel文件,可规避绝大多数列名空白问题)
读取文件后统一清洗列名格式,去除首尾空白、规整中间的连续空格:import pandas as pd import pingouin as pg df = pd.read_excel('anovacogret.xlsx') # 批量清洗列名 df.columns = df.columns.str.strip().str.replace(r'\s+', ' ', regex=True) aov = pg.anova(data=df, dv='Cognitive Reattribution', between='Type', detailed=True) aov - 表头偏移处理
如果排查发现真实表头不在Excel第一行,给pd.read_excel传入header参数指定表头所在行即可(注意pandas索引从0开始计数,比如真实表头在Excel第2行,参数设为header=1):# 示例:真实表头位于Excel第2行 df = pd.read_excel('anovacogret.xlsx', header=1) # 后续同样执行列名清洗、ANOVA计算即可 - 列名拼写/格式不匹配
直接将代码中dv参数传入的列名,替换为排查步骤中打印出的真实列名即可。
补充:如果清洗后仍报错,可按同样逻辑检查
Type分组列是否存在相同的列名不匹配问题。
内容的提问来源于stack exchange,提问作者Hadi
相关产品推荐
相关产品推荐

