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

Pandas读取Excel数据绘制折线图时遇KeyError问题求助

解决Pandas KeyError问题:索引与列名类型不匹配

你已经搞定了第一个索引问题(把Country设为行索引),但第二个错误的核心原因是年份列名的类型和你使用的years列表类型不匹配,咱们一步步拆解解决:

问题根源

从你给出的df_canada.columns能看到,年份列是整数类型(比如1980、1981),但你定义的years是字符串列表(['1980', '1981', ...])。Pandas对索引/列名的类型匹配非常严格——哪怕数值一样,整数和字符串也会被当成完全不同的标识,自然就抛出KeyError了。

两种可行解决方案

方案1:将years改为整数列表

直接用整数类型的年份匹配列名,不需要修改DataFrame的列结构:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df_canada = pd.read_excel("./Canada.xlsx", sheet_name = "Canada by Citizenship", skiprows= range(20), skipfooter=2)
# 改为整数类型的年份列表
years = list(range(1980, 2014))
# 设置Country为行索引
df_canada.set_index('Country', inplace=True)
# 现在可以正常索引并绘图
serie = df_canada.loc['Haiti', years].plot(kind='line')
plt.show()

方案2:将DataFrame的年份列名转为字符串

如果你更习惯用字符串类型的年份,可以把所有列名统一转为字符串:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df_canada = pd.read_excel("./Canada.xlsx", sheet_name = "Canada by Citizenship", skiprows= range(20), skipfooter=2)
years = list(map(str, range(1980, 2014)))
df_canada.set_index('Country', inplace=True)
# 将所有列名转为字符串类型
df_canada.columns = df_canada.columns.astype(str)
# 字符串年份现在可以匹配列名
serie = df_canada.loc['Haiti', years].plot(kind='line')
plt.show()

调试小技巧

如果不确定列名的类型,可以用这段代码快速验证:

# 查看第一个年份列(索引为8)的类型
print(type(df_canada.columns[8]))

如果输出是<class 'int'>,就说明列名是整数类型,必须和years列表的类型保持一致才能匹配成功。

内容的提问来源于stack exchange,提问作者Tlaloc-ES

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:27