2014-04-23 16 views
7

Chcę narysować wykres typu boxplot na następny pandy dataframe:Boxplot stratyfikacji przez kolumnę w pand Pythona

> 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 

chcę boxplots się w kolumnie „N0_YLDF”, ale powinny być one stratyfikację " MATA'. Kiedy używam foll. command:

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

Wykorzystuje wszystkie unikalne wartości MAT, które w pełnej liczbie p1 wynoszą około 15 000. W rezultacie powstaje niezrozumiały boxplot.

Czy jest jakiś sposób mogę stratyfikacji wartości macie, tak aby uzyskać inny wykres typu boxplot z N0_YLDF dla pierwszego kwartyla wartości macie i tak dalej ....

dzięki!

Odpowiedz

5

pandas.qcut daje quantiles, ale operacja histogram, jak będzie wymagało trochę numpy sztuczek, która pochodzi w poręczny tutaj:

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

dataframe teraz wygląda tak:

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] 

Może być również używany do uzyskania wykresu kwartylnego:

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

To wspaniała, dziękuję jeszcze raz! Czy istnieje sposób zastąpienia etykiet osi X przez rzeczywistą wartość kwantylu MAT? – user308827

+0

Co to jest ... w przerwach [...]? dzięki! – user308827

+1

To proste, możesz po prostu użyć wartości 'breaks', jeśli wykres jest zwracany jako' ax': dodaj to 'ax.xaxis.set_ticklabels (['% s'% val dla i, val in enumerate (breaks) jeśli w df.Class]) ',' breaks' zawiera krawędzie bin histogramu. –

8

Pandy posiada funkcje cut i qcut aby zmiennych stratyfikacji tak proste:

# 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') 

wyjściowa:

enter image description here

+0

dziękuję bardzo! Będę używał więcej qcut w przyszłości .... – user308827

+0

@Marius chce zrobić żądanie ściągnięcia, aby dodać to do cookbook.rst? pls robią to w linii, więc rysunek pokazuje również kod - dołącz także link do tego pytania - dzięki: – Jeff

+0

@Jeff: Oczywiście, spróbuję do tego dzisiaj dojść. Miałem zamiar sprawdzić, czy są jakieś użyteczne uwagi, które mógłbym dodać do pand, to wygląda na dobre miejsce na początek. – Marius

Powiązane problemy