为何Pandas DataFrame列操作触发KeyError: 'y1'?求故障原因
KeyError: 'y1' 报错原因分析
问题场景
在Python 3.11与Pandas 2.2环境中,执行以下脚本可正常运行:
import pandas as pd df = pd.read_csv('test.csv', comment='#') df['x1'] = df['x1']*8 # df['y1'] = df['y1']*8 print(df)
执行输出:
x1 y1 0 0 0 1 16 6 2 32 12
但取消注释df['y1'] = df['y1']*8后,脚本抛出KeyError: 'y1'异常,已知test.csv内容如下:
# comment x1, y1 0, 0 2, 6 4, 12
报错核心原因
- 你的CSV文件列名里暗藏空格:
y1列的实际列名是' y1'(逗号后有一个空格),但代码里调用的是无空格的'y1',两者不匹配,导致Pandas找不到对应列。 - 未取消注释时没报错,是因为代码没有主动访问该列;而Pandas打印DataFrame时,会自动隐藏列名的前导空格(显示为
y1),给你造成了列名无空格的视觉错觉。 - 可以通过执行
print(df.columns)验证,输出会显示Index(['x1', ' y1'], dtype='object'),明确列名带空格。
解决办法
- 方案1:修改CSV文件,删除列名里的空格,将第一行数据改为
x1,y1 - 方案2:读取CSV时添加
skipinitialspace=True参数,让Pandas自动忽略列名和字段值的前导空格:
df = pd.read_csv('test.csv', comment='#', skipinitialspace=True)
- 方案3:代码中使用带空格的列名:
df[' y1'] = df[' y1']*8
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

