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

如何基于带MultiIndex的DataFrame按产品分类绘制多列折线图?

解决方案:无需拆分DataFrame,一键实现需求

嘿,我刚好也处理过类似的多级索引绘图需求,完全不用拆成多个DataFrame!Pandas的unstack()配合绘图参数就能轻松搞定,下面给你两种简洁的实现方式:

方法一:Unstack+子图(最推荐)

直接将Product索引拆为列的二级索引,然后利用subplots=True让每一列数据单独生成一个子图,每个子图里自动区分不同Product的折线:

import pandas as pd
import matplotlib.pyplot as plt

# 初始化你的DataFrame
index = pd.MultiIndex.from_tuples(
    zip(['A','A','A','A','B','B','B','B'],[2012,2013,2014,2015,2012,2013,2014,2015]),
    names=['Product','Year']
)
df = pd.DataFrame({
    'col1':[10,20,10,30,50,20,60,80],
    'col2':[40,20,40,30,50,20,60,80],
    'col3':[10,20,80,30,80,20,80,10],
},index=index)

# 核心操作:拆Product索引为二级列,然后绘图
df.unstack('Product').plot(
    kind='line',
    subplots=True,  # 每个原列单独生成子图
    figsize=(10, 8),
    marker='o'  # 加上标记点更清晰
)
plt.tight_layout()  # 自动调整子图间距
plt.show()

这样生成的图里,每个子图对应col1/col2/col3,每个子图内会有两条折线分别对应Product A和B,x轴自动设为Year,完全匹配你的需求。

方法二:Groupby+循环绘图(灵活定制)

如果你需要更细致地控制每个子图的样式,可以用groupby结合Matplotlib的子图对象:

fig, axes = plt.subplots(1, 3, figsize=(12, 4))  # 创建1行3列的子图

for idx, col in enumerate(df.columns):
    # 按Product分组,绘制当前列的折线
    df.groupby('Product')[col].plot(
        ax=axes[idx],
        marker='s',
        legend=True
    )
    axes[idx].set_title(f'{col} Trend')  # 设置子图标题
    axes[idx].set_xlabel('Year')  # 设置x轴标签

plt.tight_layout()
plt.show()

这种方式适合需要自定义每个子图标题、颜色、图例等场景,代码稍长但灵活性更高。

两种方法都不用拆分DataFrame,选哪种取决于你对绘图样式的定制需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:32:46