【问题标题】:groupby multiple values, and plotting resultsgroupby 多个值,并绘制结果
【发布时间】:2016-03-17 12:03:07
【问题描述】:

我正在使用一些关于杀菌剂使用的数据,其中包含年份、杀菌剂、使用量,以及 panda 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的新手,还在熟悉它。

【问题讨论】:

  • 你不能简单地分组杀菌剂吗?

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


【解决方案1】:

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

得到:

【讨论】:

  • 谢谢,效果很好。作为旁白;我可以修改此代码以也为每一行生成一个图吗?我突然想到,我有太多的线条无法在一张图上显示而不会掩盖数据。 (更不用说如果我展示它,图例会覆盖一半的情节)。我尝试通过 for 循环运行未堆叠的 groupby,但似乎无法正常工作
  • 再次感谢,但问题是我想要绘制的线太多了,当将它们绘制为单个图上的子图时,它会垂直挤压到完全不可读的程度。理想情况下,我会将每条线绘制为单独的图,并保存到单独的文件路径中。为此,我试图做一个 for 循环:afplot = apple_fplot.unstack('Domain Category') for i, column in afplot: plt.figure(i);afplot[column].plot() plt.savefig('.../apple fplot{}'.format(i)) 我不确定这是否可行,但它给了我:ValueError: too many values to unpack
【解决方案2】:

你可以这样做:

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

【讨论】:

    【解决方案3】:

    类似的东西:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-22
      • 2017-01-20
      • 2017-03-07
      • 1970-01-01
      • 2020-07-04
      • 2018-02-24
      • 2013-03-06
      • 2012-11-24
      相关资源
      最近更新 更多