2015-11-16 20 views
5

Ho questo esempio dataframe:Come tracciare determinate righe di un dataframe panda?

 animal gender  name first second third 
0  dog  m  Ben  5  6  3 
1  dog  f Lilly  2  3  5 
2  dog  m  Bob  3  2  1 
3  cat  f  Puss  1  4  4 
4  cat  m Inboots  3  6  5 
5 wolf  f  Lady NaN  0  3 
6 wolf  m Summer  2  2  1 
7 wolf  m  Grey  4  2  3 
8 wolf  m  Wind  2  3  5 
9 lion  f  Elsa  5  1  4 
10 lion  m Simba  3  3  3 
11 lion  f  Nala  4  4  2 

Ora, ho il sospetto che potrebbero aver bisogno di indicizzazione gerarchico per questo, ma non ho ottenuto che lontano nel Panda ancora. Tuttavia, ho davvero bisogno di fare alcune cose (apparentemente troppo avanzate) con esso e non ho capito come farlo. Fondamentalmente, quello che mi piacerebbe avere alla fine è, in questo caso, una trama (probabilmente una trama a dispersione, anche se una linea servirebbe altrettanto bene in questo momento).

1) Mi piacerebbe avere una figura di 4 sottotrame - una sottotrama per ogni animale. Il titolo di ciascuna sottotrama dovrebbe essere l'animale.

2) In ciascuna delle sottotrame, vorrei tracciare i numeri (ad esempio il numero di cuccioli nati ogni anno), cioè i valori di "primo", "secondo" e "terzo" per una data riga e dargli un'etichetta, che mostrerebbe il 'nome' nella legenda. E per ogni sottotrama (ogni animale), vorrei tracciare separatamente il maschio e la femmina (es. Maschio in blu e femmina in rosso) e inoltre, trama anche la media per l'animale (cioè la media in ogni colonna per il dato animale) in nero.

3) una nota: tramando contro 1,2,3 per exaple - riferendosi al numero di colonna, Così, per esempio, per la prima sottotrama con il titolo 'cane' Vorrei tracciare qualcosa come plt.plot(np.array([1,2,3]),x,'b', np.array([1,2,3]),y,'r', np.array([1,2,3]), np.mean(x,y,axis=1),'k') dove x sarebbe (nel primo caso) 5,6,3 e la legenda per questa trama blu mostrerebbe "Ben", y sarebbe 2,3,5 e la legenda per la trama rossa mostrerebbe "Lilly" e il nero la trama sarebbe 3,5, 4,5, 4 e nella legenda definirò che è "media" (per ciascuna delle sottotrame).

Spero di essere stato abbastanza chiaro. Capisco che senza vedere la figura risultante potrebbe essere difficile immaginarlo ma ... beh, se sapessi come farlo, non lo chiederei ...

Quindi, in conclusione, vorrei loop attraverso il dataframe su diversi livelli, avendo animali su sottotrame separati e confronto tra maschi e femmine e la media tra loro in ciascuna delle sottotrame.

Il mio dataframe reale è molto più grande, quindi, nel caso ideale, mi piacerebbe una soluzione che sia robusta ma di facile comprensione (per un principiante di programmazione).

Per avere un'idea di ciò una sottotrama dovrebbe essere simile, questo è il prodotto in Excel:

briefly outlined plot

+1

Utilizzare 'per i, gruppo in df.groupby ('animal'):' e traccia in un ciclo. Non una risposta perché sono un po 'frettoloso per il tempo. –

+0

Penso che la mia domanda sia parzialmente soddisfatta qui: http://stackoverflow.com/questions/14300137/making-matplotlib-scatter-plots-from-dataframes-in-pythons-pandas?rq=1 ma ancora, non sono del tutto fiducioso con l'indicizzazione e il looping attraverso questi dati multidimensionali e specialmente tracciando righe, non colonne ... – durbachit

+0

Grazie Chinmay! Quando hai tempo, potresti spiegarci di più? (Ad esempio, come gestisco i due argomenti per groupby - per cosa è "i"? E come indirizzare le righe dell'oggetto raggruppato.) – durbachit

risposta

1

io non sono sicuro se ho capito bene chattare volevi dire. Ma penso che sia necessario trasformare il tuo dataframe in un formato longform o tidy format, poiché molte operazioni su di esso saranno più semplici con quel formato, iniziando con la creazione di grafici basati su variabili categoriali.

Con df essere il vostro dataframe, per trasformarlo in un formato ordinato, basta usare:

df2 = pd.melt(df, id_vars=["animal","gender","name"]) 
df2 
    animal gender  name variable value 
0 dog  m  Ben first 5.0 
1 dog  f Lilly first 2.0 
2 dog  m  Bob first 3.0 
3 cat  f  Puss first 1.0 
4 cat  m Inboots first 3.0 
... 
31 wolf  m  Grey third 3.0 
32 wolf  m  Wind third 5.0 
33 lion  f  Elsa third 4.0 
34 lion  m Simba third 3.0 
35 lion  f  Nala third 2.0 

Poi (quasi) tutto diventa semplice, basta usare Seaborn come segue:

g = sns.factorplot(data=df2, # from your Dataframe 
        col="animal", # Make a subplot in columns for each variable in "animal" 
        col_wrap=2, # Maximum number of columns per row 
        x="variable", # on x-axis make category on the variable "variable" (created by the melt operation) 
        y="value", # The corresponding y values 
        hue="gender", # color according to the column gender 
        kind="strip", # the kind of plot, the closest to what you want is a stripplot, 
        legend_out=False, # let the legend inside the first subplot. 
        ) 

Poi è possibile migliorare l'estetica generale:

g.set_xlabels("year") 
g.set_titles(template="{col_name}") # otherwise it's "animal = dog", now it's just "dog" 
sns.despine(trim=True) # trim the axis. 

stripplot seaborn

Per aggiungere i valori medi, è necessario farlo manualmente. Tuttavia, se si dispone di più dati, è possibile considerare anche un grafico a riquadri o un violinplot, che è possibile utilizzare sopra stripplot, btw.

Vi invito a verificare Seaborn's documentation per un ulteriore miglioramento della trama.

HTH

Problemi correlati