如何在 Pandas 中分组、计数然后绘制条形图?

Jan*_*yne 3 python dataframe pandas

我有一个如下所示的Pandas数据框。

年月班
---- ----- -----
2015 1 1
2015 1 1
2015 1 2
2015 1 2
...

我希望能够在一个图上创建此数据的 2 个条形图系列。如果我可以做一个groupbycount并最终得到一个,data frame那么我想我可以做一个简单的dataframe.plot.barh.

我尝试过的是以下代码。

x = df.groupby(['year', 'month', 'class'])['class'].count()
Run Code Online (Sandbox Code Playgroud)

什么x最终被一个Series。那么我执行以下操作以获得DataFrame.

df = pd.DataFrame(x)
Run Code Online (Sandbox Code Playgroud)

这让我非常接近。数据最终如下所示。

                       克拉兹
年月克拉兹        
2015 1 1 2
     2 1 15
     2 2 45

但是当我做条形图时df.plot.bar(),我只看到一个系列。所需的输出只是一个系列,从 2015-01 到 2019-12,1class每月发生多少次?然后是另一个系列,从 2015-01 到 2019-12,2class每月发生多少次?

关于如何以这种方式操纵数据的任何想法?

ans*_*sev 7

我们还可以使用DataFrame.pivot_table

df.pivot_table(index=['year','month'],columns='class',aggfunc='size').plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


或者

df.pivot_table(index='class',columns=['year','month'],aggfunc='size').plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Bra*_*don 5

A groupby-unstack应该可以解决问题:

数据

df = pd.DataFrame([[2015, 1, 1],
                    [2015, 1, 1],
                    [2015, 1, 2],
                    [2015, 1, 2],
                    [2015, 1, 2],
                    [2015, 2, 1],
                    [2015, 2, 1],
                    [2015, 2, 1],
                    [2015, 2, 2],
                    [2015, 2, 2]], columns = ['year', 'month', 'class'])
Run Code Online (Sandbox Code Playgroud)

解决方案

df_gb = df.groupby(['year', 'month', 'class']).size().unstack(level=2)
Run Code Online (Sandbox Code Playgroud)

输出

df_gb.plot(kind = 'bar')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明