groupby多个值,并绘制结果

时间:2015-12-11 14:29:52

标签: python pandas matplotlib group-by data-analysis

我使用了一些关于杀菌剂使用的数据,这些数据包括年份,杀菌剂,使用量以及熊猫DataFrame中的一些不相关的列。看起来有点像:

Year, State,      Fungicide, Value
2011, California, A,         12879
2011, California, B,         29572
2011, Florida,    A,         8645
2011, Florida,    B,         19573
2009, California, A,         8764
2009, California, B,         98643,
...

我想要的是随着时间的推移使用的总杀菌剂的单个图,每个单独的杀真菌剂(以不同的颜色)绘制线。我使用.groupby来获取每年使用的每种杀菌剂的总量:

apple_fplot = df.groupby(['Year','Fungicide'])['Value'].sum()

这给了我想要绘制的值,例如:

Year, Fungicide, Value
...
2009, A,        128635
      B,        104765
2011, A,        154829
      B,        129865

现在我需要绘制它,以便每种杀菌剂(A,B,...)在时间上的值 p>

有没有一种方法可以做到这一点而不将它全部分开?原谅我的无知,我是python的新手,我仍然熟悉它。

3 个答案:

答案 0 :(得分:7)

你可以这样做:

import matplotlib
matplotlib.style.use('ggplot')
import matplotlib.pyplot as plt

plt.figure()
df.groupby(['Year','Fungicide']).sum().unstack().plot()

enter image description here

数据

   Year        State Fungicide  Value
0  2011   California         A  12879
1  2011   California         B  29572
2  2011      Florida         A   8645
3  2011      Florida         B  19573
4  2009   California         A   8764
5  2009   California         B  98643

答案 1 :(得分:6)

对于正确打印legendxticks的干净解决方案,您可以

apple_fplot = df.groupby(['Year','Fungicide'])['Value'].sum()
plot_df = apple_fplot.unstack('Fungicide').loc[:, 'Value']
plot_df.index = pd.PeriodIndex(plot_df.index.tolist(), freq='A')
plot_df.plot()

enter image description here 对于subplots,只需将相应的keyword设置为True

即可
plot_df.plot(subplots=True)

得到:

enter image description here

答案 2 :(得分:2)

类似于:

df_grouped = df.groupby('Fungicide')
for key, group in df_grouped:
   group.groupby('Year')['Value'].sum().plot(ax=ax,label=key)

通过在groupby对象上使用for循环将遍历每个组,分配键(例如'A'或'B',它按列分组的值),以及每次组数据帧。

点击此处查看示例

http://pandas.pydata.org/pandas-docs/stable/groupby.html#iterating-through-groups