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

为何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

错误原因

  1. pd.wide_to_long执行后,id会被设置为DataFrame的索引层级,而非普通数据列,直接用df['id']访问自然会触发KeyError。
  2. 你看到的"仅存在一列"是因为宽表转长表后,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:05:08