groupby 多个值,并绘制结果

Posted

技术标签:

【中文标题】groupby 多个值,并绘制结果【英文标题】:groupby multiple values, and plotting results 【发布时间】: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的新手,还在熟悉它。

【问题讨论】:

你不能简单地分组杀菌剂吗? 【参考方案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

【讨论】:

以上是关于groupby 多个值,并绘制结果的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn通过多个groupby绘制熊猫数据框

多个 GROUP BY 并根据第一个 GROUP BY 的结果选择值

如何在图表中绘制熊猫 groupby 值

如何使用 plotly 和 streamlit 绘制 groupby

[Mysql 查询语句]——分组查询group by

Linq 中按照多个值进行分组(GroupBy)