如何在熊猫中分组,计数并绘制条形图?

时间:2019-12-05 22:56:03

标签: python pandas dataframe

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

year  month  class
----  -----  -----
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()

x最终是Series。因此,我接下来执行以下操作以获得DataFrame

df = pd.DataFrame(x)

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

                       clazz
year month clazz        
2015 1     1            2
     2     1           15
     2     2           45

但是当我进行条形图df.plot.bar()时,我只会看到一个序列。从2015年1月至2019年12月,期望的输出只是一个系列,每月class 1出现了几次?然后是2015年1月至2019年12月的另一个系列,每月class 2发生几次?

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

2 个答案:

答案 0 :(得分:3)

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'])

解决方案

df_gb = df.groupby(['year', 'month', 'class']).size().unstack(level=2)

输出

df_gb.plot(kind = 'bar')

enter image description here

答案 1 :(得分:2)

我们也可以使用DataFrame.pivot_table

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

enter image description here


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

enter image description here