我有一个Pandas
数据框,如下所示。
year month class ---- ----- ----- 2015 1 1 2015 1 1 2015 1 2 2015 1 2 ...
我希望能够在一个绘图上创建此数据的2个条形图系列。如果我可以做groupby
,count
并以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发生几次?
关于如何以这种方式操作数据的任何想法?
答案 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')
答案 1 :(得分:2)
我们也可以使用DataFrame.pivot_table
:
df.pivot_table(index=['year','month'],columns='class',aggfunc='size').plot(kind='bar')
或
df.pivot_table(index='class',columns=['year','month'],aggfunc='size').plot(kind='bar')