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
相关产品推荐
相关产品推荐

