为何Python在为id列加1时抛出KeyError错误?
问题描述
我需要将数据中的id列值加1,这样才能和包含国家名称索引的文本文件合并(双方ID必须一致)。但运行以下代码时,Python抛出了KeyError: 'id'错误,打印DataFrame后发现只有一列,怀疑是数据重塑操作出了问题。
import requests, zipfile, io import pandas as pd import numpy as np url = 'http://qed.econ.queensu.ca/jae/datasets/hsiao003/hcw-data.zip' filename = 'hcw-data.txt' r = requests.get(url) z = zipfile.ZipFile(io.BytesIO(r.content)) z.extractall() df = pd.read_csv(filename, sep = '\t+' , header=None) df.columns = ['gdp_' + str(col) for col in df.columns] df['time'] = np.arange(len(df))+1 df = pd.wide_to_long(df, stubnames="gdp", i=["time"], j="id", sep="_") df['id'] = df['id'] + 1
错误原因
pd.wide_to_long执行后,id会被设置为DataFrame的索引层级,而非普通数据列,直接用df['id']访问自然会触发KeyError。- 你看到的"仅存在一列"是因为宽表转长表后,
time和id都被移到了索引中,数据区只剩gdp这一列。
修复方案
方案1:将索引转为普通列后修改id
通过reset_index()把索引层级转为普通列,再对id进行加1操作:
df = pd.wide_to_long(df, stubnames="gdp", i=["time"], j="id", sep="_").reset_index() df['id'] = df['id'] + 1
方案2:直接修改索引中的id值
如果不需要把id转为普通列,可以直接修改索引层级的数值:
df = pd.wide_to_long(df, stubnames="gdp", i=["time"], j="id", sep="_") # 更新id索引层级的值 df.index = df.index.set_levels(df.index.get_level_values('id') + 1, level='id')
额外优化:确保数据读取正确
你提到的单列问题,可能是read_csv的分隔符设置有误。原数据是单制表符分隔,建议用sep='\t'替代sep='\t+'(后者会匹配多个制表符,可能导致列识别错误):
df = pd.read_csv(filename, sep='\t', header=None)
内容的提问来源于stack exchange,提问作者Jared Greathouse
相关产品推荐
相关产品推荐

