来自多索引数据的堆积图

时间:2018-12-07 08:08:02

标签: python pandas dataframe matplotlib plot

我知道如何绘制这样的东西:

               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代表原始n log n但制作得更优雅here

1 个答案:

答案 0 :(得分: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