来自多索引数据的堆叠图

Posted

技术标签:

【中文标题】来自多索引数据的堆叠图【英文标题】:Stacked plots from a multi-index data 【发布时间】:2019-05-08 23:37:47 【问题描述】:

我知道如何绘制这样的图:

               SEASON1  SEASON2  SEASON3
area                                    
A   299.0  2.0  257.0
B   13.0  33.0  198.0
C   22044.0  2.0  22.0

使用

df.plot(kind='bar', stacked=True, rot=90, edgecolor='black')
df.T.plot(kind='bar', stacked=True, rot=0, edgecolor='black')

导致:

stacked

transposed stacked

我很难为下面的df 获得相同(甚至更好看)的图,它代表原始的df,但更优雅地制作了here。

【问题讨论】:

【参考方案1】:

您要做的是取消堆叠数据框,并更改列的名称。

你可以这样做:

df.unstack()
  .rename(columns = 
            "2016Q1" : "Season 1",
            "2016Q2" : "Season 2",
            "2016Q3" : "Season 3",
        )

您可以在文档中找到有关 unstack 的作用以及它是如何做的示例。至于rename 方法,它需要一个映射来将你的名字从某个东西转换为其他东西。

我没有尝试让您的示例工作,但我从上面的 unstack 文档中举了一个示例。

index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
                                   ('two', 'a'), ('two', 'b')])

df = pd.DataFrame( np.arange(1.0, 5.0), index=index, columns=['hi'])
print(df)
#         hi
# one a  1.0
#     b  2.0
# two a  3.0
#     b  4.0

df = df.unstack(level = -1)
       .rename(columns = 
            "a" : "Season 1",
            "b" : "Season 2"
        )
print(df)
#           hi         
#     Season 1 Season 2
# one      1.0      2.0
# two      3.0      4.0

可能有更好的方法来处理 DataFrame 上方的“hi”,但您可以 select 它,它会消失。

print( s['hi'] )
     Season 1  Season 2
one       1.0       2.0
two       3.0       4.0

【讨论】:

甜蜜。经测试。在职的!所以我的结论是,最好的做法可能是不处理原始的多索引df 对吗?如果是这样,我会去将答案标记为已接受。 @KyleDickson 好吧,我没有对这个主题进行很多研究,但考虑一下,通常情节是 2D 的,而 DataFrame 是 2D 对象。多索引对于处理 2D+ 数据很有用。我不认为 pandas 多索引可以处理 3D 级别的图。我认为这与最佳实践或其他任何东西无关。 @KyleDickson 如果您查看this answer,您会发现您可以决定在不同的轴上绘制多索引。这将是一个不同的选择。 :) 在这里,您不应该考虑最佳实践,而是考虑可能性:我可以将 3D 对象插入 2D 绘图仪吗? :p

以上是关于来自多索引数据的堆叠图的主要内容,如果未能解决你的问题,请参考以下文章

如何将单行与它自己的索引与未堆叠的多索引数据框结合起来?

将列从多索引堆叠到单索引

如何从具有多级重复列的excel表中取消堆叠df?设置多索引?

在熊猫数据框上设置多索引的最佳方法

R绘制堆叠的密度图(Stacked Area Chart)

Echarts堆叠柱状图