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】:对于正确打印legend
和xticks
的干净解决方案,您可以
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 多个值,并绘制结果的主要内容,如果未能解决你的问题,请参考以下文章
多个 GROUP BY 并根据第一个 GROUP BY 的结果选择值