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

Pandas多索引数据框绘图:将索引b设为X轴、列c设为Y轴

解决Pandas双索引DataFrame的绘图问题:以索引'b'为X轴、列'c'为Y轴

嘿,我之前也碰到过多索引绘图的小麻烦,给你几个简单直接的解决方案,照着来就能搞定:

先模拟你的数据结构(方便对照)

首先假设你的双索引DataFrame大概长这样,先建个示例方便测试:

import pandas as pd
import matplotlib.pyplot as plt

# 构造双索引(a和b)的DataFrame
data = {'c': [12, 25, 33, 41, 57, 62]}
multi_index = pd.MultiIndex.from_tuples(
    [('group1', 'b1'), ('group1', 'b2'), ('group1', 'b3'), 
     ('group2', 'b1'), ('group2', 'b2'), ('group2', 'b3')],
    names=['a', 'b']
)
df = pd.DataFrame(data, index=multi_index)

方案1:重置索引(最直观,推荐)

把双索引转成普通列,这样就和你熟悉的单索引绘图操作完全一样了:

# 重置索引,让原来的索引'a'、'b'变成DataFrame的列
df_flat = df.reset_index()

# 直接指定x和y绘图,支持各种plot类型(line/bar/scatter等)
df_flat.plot(x='b', y='c', kind='line', marker='s', color='#2ecc71')
plt.title('双索引转普通列后绘图')
plt.xlabel('索引b')
plt.ylabel('列c')
plt.show()

这个方法的好处是逻辑简单,后续调整绘图样式、添加分组都很方便,新手友好。

方案2:直接提取索引层级(不修改原DataFrame)

如果不想改变原DataFrame的结构,可以直接提取索引'b'的所有值作为X轴:

# 获取索引'b'的所有取值
x_axis = df.index.get_level_values('b')
y_axis = df['c']

# 用matplotlib原生绘图(也可以结合pandas的plot方法)
plt.plot(x_axis, y_axis, marker='o', color='#e74c3c', linestyle='--')
plt.title('直接提取双索引层级绘图')
plt.xlabel('索引b')
plt.ylabel('列c')
plt.show()

这个方法适合需要保留原多索引结构的场景,不用额外复制DataFrame。

方案3:分组绘图(当同一'b'对应多个分组时)

如果你的双索引中,同一个'b'对应不同的'a'分组(比如示例里的group1和group2),可以按'a'分组绘制多条曲线:

df_flat = df.reset_index()

# 按索引'a'分组,每个分组单独绘图
for group_name, group_data in df_flat.groupby('a'):
    plt.plot(group_data['b'], group_data['c'], marker='^', label=f'分组{group_name}')

plt.title('按双索引分组绘图')
plt.xlabel('索引b')
plt.ylabel('列c')
plt.legend()
plt.show()

这样可以清晰区分不同分组下的趋势,适合对比分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:02:49