2014-04-23 17 views
7

vorrei disegnare un grafico a scatole per i seguenti panda dataframe:Boxplot stratificato per colonna panda pitone

> p1.head(10) 

    N0_YLDF MAT 
0  1.29 13.67 
1  2.32 10.67 
2  6.24 11.29 
3  5.34 21.29 
4  6.35 41.67 
5  5.35 91.67 
6  9.32 21.52 
7  6.32 31.52 
8  3.33 13.52 
9  4.56 44.52 

Voglio che i grafici a scatole di essere della colonna 'N0_YLDF', ma dovrebbero essere stratificato per ' STUOIA'. Quando uso il foll. comando:

p1.boxplot(column='N0_YLDF',by='MAT') 

Utilizza tutti i valori MAT unici, che nel numero completo di dati p1 intorno a 15.000. Ciò si traduce in un boxplot incomprensibile.

C'è un modo per stratificare i valori MAT, in modo che ho un diverso boxplot di N0_YLDF per primo quartile di valori MAT e così via ....

grazie!

risposta

5

pandas.qcut vi darà i quantili, ma un'operazione di istogramma simile richiederà alcuni numpy inganno che torna utile qui:

_, breaks = np.histogram(df.MAT, bins=5) 
ax = df.boxplot(column='N0_YLDF', by='Class') 
ax.xaxis.set_ticklabels(['%s'%val for i, val in enumerate(breaks) if i in df.Class]) 

enter image description here

Il dataframe ora assomiglia a questo:

N0_YLDF MAT Class 
0  1.29 13.67  1 
1  2.32 10.67  0 
2  6.24 11.29  1 
3  5.34 21.29  1 
4  6.35 41.67  2 
5  5.35 91.67  5 
6  9.32 21.52  1 
7  6.32 31.52  2 
8  3.33 13.52  1 
9  4.56 44.52  3 

[10 rows x 3 columns] 

Può anche essere utilizzato per ottenere la trama del quartile:

breaks = np.asarray(np.percentile(df.MAT, [25,50,75,100])) 
df['Class'] = (df.MAT.values > breaks[..., np.newaxis]).sum(0) 
ax = df.boxplot(column='N0_YLDF', by='Class') 
ax.xaxis.set_ticklabels(['%s'%val for val in breaks]) 

enter image description here

+0

Questo è grande, lo ringraziano così molto di nuovo! Esiste un modo per sostituire le etichette dell'asse x con il valore del quantile MAT esistente? – user308827

+0

Inoltre, qual è il ... nelle pause [...]? Grazie! – user308827

+1

È facile, puoi semplicemente usare i valori di 'breaks', se il plot viene restituito come' ax': aggiungi questo 'ax.xaxis.set_ticklabels (['% s'% val per i, val in enumerate (breaks) se io in df.Class]) ',' break' contiene i bordi del cestino dell'istogramma. –

8

Panda ha le cut e qcut funzioni per rendere le variabili stratificazione in questo modo facile:

# Just asking for split into 4 equal groups (i.e. quartiles) here, 
# but you can split on custom quantiles by passing in an array 
p1['MAT_quartiles'] = pd.qcut(p1['MAT'], 4, labels=['0-25%', '25-50%', '50-75%', '75-100%']) 
p1.boxplot(column='N0_YLDF', by='MAT_quartiles') 

uscita:

enter image description here

+0

grazie mille! Userò più di qcut in futuro .... – user308827

+0

@Marius vuole fare una richiesta di pull per aggiungere questo a cookbook.rst? lo faccio in linea così la figura lo mostra anche con il codice - includi anche un link a questa domanda - grazie – Jeff

+0

@Jeff: Certo, cercherò di farcela stasera. Volevo vedere se c'erano dei contributi utili che potevo aggiungere ai panda, questo sembra un buon punto di partenza. – Marius

Problemi correlati