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

如何在matplotlib中将DataFrame列名作为x轴值绘制多城市时序数据

错误原因

你遇到的KeyError是因为loc是基于行索引标签取值,而非行的物理位置。如果你之前对DataFrame做过过滤、删除、排序等操作,行索引就不会是连续的0-8,自然在取loc[2]的时候找不到对应标签的行。


解法1:Pandas原生绘图(推荐,无需手动写循环)

你不需要自己遍历行列,只需要把数据结构调整为matplotlib适配的格式即可:先将City列设为行索引,再转置DataFrame,转置后行就是年份,每列对应一个城市的数值,直接调用plot方法就能自动生成每条城市的折线,还自带图例。
代码示例:

import matplotlib.pyplot as plt

# 调整数据结构:设置City为索引后转置
processed_df = toPlot.set_index('City').T
# 直接绘图
processed_df.plot(kind='line', figsize=(12, 6))
# 按需配置坐标轴和图例
plt.xlabel('年份')
plt.ylabel('数值')
plt.legend(title='城市')
plt.show()

解法2:修改你原有的循环逻辑

如果你要沿用自己的思路,只需要把按标签取数的loc改成按行位置取数的iloc,同时提取城市名作为折线的label即可:

import matplotlib.pyplot as plt

years = range(1990, 2021)
# 遍历所有行
for row_idx in range(len(toPlot)):
    # 提取当前行的城市名
    city_name = toPlot.iloc[row_idx, 0]
    # 提取当前行所有年份的数值(第1列到最后一列都是年份数据)
    datapoints = toPlot.iloc[row_idx, 1:].values
    # 绘图时指定label用于图例显示
    plt.plot(years, datapoints, label=city_name)

plt.xlabel('年份')
plt.ylabel('数值')
plt.legend(title='城市')
plt.show()

内容的提问来源于stack exchange,提问作者tnorr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 20:57:04