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

