web-dev-qa-db-fra.com

grouper plusieurs valeurs et tracer les résultats

J'utilise des données sur l'utilisation des fongicides qui ont l'année, le fongicide, la quantité utilisée, ainsi que des colonnes non pertinentes dans un DataFrame panda. Cela ressemble un peu à:

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,
...

Ce que j'en veux, c'est une seule parcelle de fongicide total utilisé au fil du temps, avec une ligne tracée pour chaque fongicide individuel (dans une couleur différente). J'ai utilisé .groupby pour obtenir la quantité totale de chaque fongicide utilisé chaque année:

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

Cela me donne les valeurs que je veux tracer, quelque chose comme:

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

Maintenant, je dois le tracer pour que chaque fongicide (A, B, ...) soit une ligne distincte sur une seule parcelle de Valeur dans le temps

Existe-t-il un moyen de le faire sans tout séparer? Pardonnez mon ignorance, je suis nouveau à python et je me familiarise toujours avec.

10
A. Chatfield

Pour une solution propre qui imprime correctement legend et xticks, vous pouvez

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 Pour subplots, définissez simplement les keyword respectifs sur True:

plot_df.plot(subplots=True)

obtenir:

enter image description here

8
Stefan

Tu peux faire:

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

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

enter image description here

Données

   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
9
Colonel Beauvel

quelque chose comme:

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

En utilisant for loop sur un objet groupby, vous parcourrez chaque groupe, en attribuant la clé (par exemple, `` A '' ou `` B '', les valeurs de la colonne par laquelle il a été groupé) et le groupe de données à chaque fois.

Voir ici pour un exemple

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

3
Chris