2015-12-11 12 views
7

Używam niektórych danych na temat stosowania środków grzybobójczych, które mają zastosowany Rok, Fungicyd, Ilość oraz kilka nieistotnych kolumn w panda DataFrame. Wygląda to trochę jak:groupby wiele wartości i wyniki kreślenia

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

Co chcę od niego jest jeden wykres całkowitej fungicydu stosowanego w czasie, ze linia wykreślona dla każdego środka grzybobójczego (w innym kolorze). Użyłem .groupby aby uzyskać całkowitą ilość każdego środka grzybobójczego stosowanego rocznie:

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

To daje mi wartości, które chcę wykreślić, coś takiego:

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

Teraz muszę wykreślić tak że każdy fungicyd (a, B, ...) jest oddzielna linia na jednej działce z wartości w czasie

Czy istnieje sposób to zrobić bez oddzielania to wszystko? Wybacz mojej niewiedzy, jestem nowy dla Pythona i wciąż go poznaję.

+0

Nie możesz po prostu zgrupować fungicydu? –

Odpowiedz

5

Na czystym roztworze, który prawidłowo drukuje legend i xticks, można

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 Dla subplots, wystarczy ustawić odpowiedni keyword do True :

plot_df.plot(subplots=True) 

dostać:

enter image description here

+0

Dzięki, że działa naprawdę dobrze. Tak na marginesie; czy mogę zmodyfikować ten kod, aby utworzyć wykres dla każdej linii? Przyszło mi do głowy, że mam zbyt wiele linii do pokazania na jednym wykresie bez przesłaniania danych. (nie wspominając o tym, że legenda figurująca obejmuje połowę fabuły, jeśli ją pokażę). Próbowałem uruchomić nieproszonego groupby za pośrednictwem pętli for, ale nie mogę uzyskać tego działającego –

+0

Jeszcze raz dziękuję, ale problem polega na tym, że jest tak wiele linii, które chcę wykreślić, kiedy je narysowują jako subplots na jednym wykresie staje się pionowo zgnieciony do tego stopnia, że ​​jest całkowicie nieczytelny. Idealnie byłoby, gdyby każda linia była narysowana jako oddzielna działka i zapisana w oddzielnej ścieżce pliku. afplot [kolumny] .plot; plt.figure (I): 'afplot = apple_fplot.unstack ('domen') kategorii do I, kolumny afplot: Na to próbuje zrobić na pętlę() plt.savefig (".../apple fplot {}" format (i)) ' Nie jestem pewien, czy to zadziała, ale daje mi: ValueError: zbyt wiele wartości do rozpakowania –

1

coś na wzór:

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

Za pomocą pętli na obiekcie GroupBy będzie iterację każdej grupie przypisanie klucza (na przykład typu „A” lub „B”, o wartości w kolumnie nie został zgrupowany według), a grupowa ramka danych za każdym razem.

Patrz tutaj dla przykładu

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

5

można zrobić:

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

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

enter image description here

danych

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