groupby 多个值,并绘制结果

groupby multiple values, and plotting results

我正在使用一些有关杀菌剂使用情况的数据,其中包含年份、杀菌剂、使用量以及熊猫 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、...)在 值超过时间

有没有办法做到这一点而不把它们全部分开?请原谅我的无知,我是 python 的新手,并且还在逐渐熟悉它。

大致如下:

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

对于正确打印 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()

对于subplots,只需将相应的keyword设置为True:

plot_df.plot(subplots=True)

获得:

你可以这样做:

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

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

数据

   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