如何为多索引数据框创建图

Posted

技术标签:

【中文标题】如何为多索引数据框创建图【英文标题】:How to create a plot for a multiindex dataframe 【发布时间】:2021-10-09 07:46:17 【问题描述】:

我需要为每个游戏平台制作情节(y = 'total_sales_sum'x = 'year_of_release')。为此,我使用了数据透视表,因此得到了多索引数据框。

data_recent_decade=data.query('year_of_release>=2006').pivot_table(index=['platform','year_of_release'],values=['total_sales'], aggfunc=['sum'])
data_recent_decade.columns=['total_sales_sum']
data_recent_decade.info()
for platform in data_recent_decade:
    data_recent_decade.plot(y='total_sales_sum', marker='o',grid=True,figsize=(13,4))
    plt.title(platform)
    plt.show()

这是最终的数据框:

这是 data_recent_decade.info()

MultiIndex:101 个条目,(3DS,2011.0)到(XOne,2016.0) 数据列(共1列): total_sales_sum 101 非空 float64 数据类型:float64(1) 内存使用量:1.4+ KB

我的破局:

如何为每个平台制作一个情节?

【问题讨论】:

df.reset_index().pivot(index='year_of_release', columns='platform', values='total_sales_sum').plot(marker='.') 【参考方案1】:

您可以使用以下命令遍历pandas.MultiIndex

for date, new_df in df.groupby(level = 0)

完整代码

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame('platform': ['3DS', '3DS', '3DS', '3DS', '3DS', 'XB', 'XBOne', 'XBOne', 'XBOne', 'XBOne'],
                   'year_of_release': [2011, 2012, 2013, 2014, 2015, 2008, 2013, 2014, 2015, 2016],
                   'total_sales_sum': [60.53, 51.01, 56.32, 43.07, 27.21, 0.18, 18.96, 54.07, 59.92, 25.82])
df = df.set_index(['platform', 'year_of_release'])


fig, ax = plt.subplots()

for date, new_df in df.groupby(level = 0):
    ax.plot(new_df.index.get_level_values('year_of_release').values,
            new_df['total_sales_sum'],
            label = new_df.index.get_level_values('platform').values[0],
            marker = 'o',
            linestyle = '-')

ax.legend(frameon = True)

plt.show()


作为替代方案,您可以使用seaborn.lineplot 来执行此操作而无需任何循环:

fig, ax = plt.subplots()

sns.lineplot(ax = ax,
             data = df,
             x = df.index.get_level_values('year_of_release'),
             y = df['total_sales_sum'],
             hue = df.index.get_level_values('platform'),
             marker = 'o')

plt.show()

【讨论】:

以上是关于如何为多索引数据框创建图的主要内容,如果未能解决你的问题,请参考以下文章

从现有数据框创建多索引

来自另一个数据框的熊猫多索引分配

如何为与python中列的最大值对应的多索引的每个级别返回索引

如何从嵌套字典创建多索引数据框?

从 Pandas 多索引数据框创建等高线图

为多索引 Panda 数据框创建基于另一列的新列