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

如何用Pandas绘制多层索引数据:外层索引为X轴,内层索引为折线

解决多层索引DataFrame绘制多折线图的问题

我来帮你搞定这个问题!你遇到的核心问题是stack操作后的数据结构不符合pandas plot的分组要求,导致只画出了一条折线。咱们一步步拆解解决:

问题根源分析

先看你的原始数据结构:

my_data = {0: {'a': 1, 'b': 2}, 1: {'a': 1, 'b': 2}}

用pd.DataFrame.from_dict(my_data)生成的初始DataFrame是这样的:

0  1
a  1  1
b  2  2

转置(.T)后变成:

a  b
0  1  2
1  1  2

这时候你用.stack()会把列(a、b)转成内层索引,得到一个多层索引的Series:

0  a    1
   b    2
1  a    1
   b    2
dtype: int64

pandas对这种Series绘图时,会把所有值按索引顺序连成一条线,而不会按内层索引(a、b)分组,所以只出现了一条折线。

两种可行解决方案

方案1:直接转置后绘图(最简单)

不需要stack操作,转置后的DataFrame已经完美符合你的需求:外层索引(0、1)是X轴,列(a、b)对应不同折线,数值是Y轴。

完整代码:

import pandas as pd

my_data = {0: {'a': 1, 'b': 2}, 1: {'a': 1, 'b': 2}}
data = pd.DataFrame.from_dict(my_data).T  # 转置得到正确的行列结构
data.plot(kind='line', xlabel='外层索引', ylabel='数值', title='多折线图')

运行后会自动生成两条折线,分别对应a和b,X轴就是你的外层索引0、1。

方案2:stack后再unstack恢复列结构

如果你已经做了stack操作,可以通过unstack把内层索引重新转成列,再绘图:

import pandas as pd

my_data = {0: {'a': 1, 'b': 2}, 1: {'a': 1, 'b': 2}}
data = pd.DataFrame.from_dict(my_data).T.stack()
data = data.unstack(level=1)  # 将内层索引(a、b)转为列
data.plot(kind='line', xlabel='外层索引', ylabel='数值', title='多折线图')

这个方法和方案1的效果完全一致,适合你已经有stack后数据的场景。

额外说明

如果你的数据更复杂(比如外层索引是日期或连续值),可以用reset_index()把外层索引转成普通列,再指定x参数绘图,比如:

data = data.reset_index()
data.plot(x='index', y=['a', 'b'], xlabel='外层索引', ylabel='数值')

这样能更灵活地控制X轴的显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:58:52