2014-04-17 18 views
6

Mam następujący dataframe w Pythonie (rzeczywista dataframe jest znacznie większy, po prostu prezentuje małą próbkę):Python boxplot z kolumn o różnej długości

 A  B  C  D  E  F 
0 0.43 0.52 0.96 1.17 1.17 2.85 
1 0.43 0.52 1.17 2.72 2.75 2.94 
2 0.43 0.53 1.48 2.85 2.83 
3 0.47 0.59 1.58  3.14 
4 0.49 0.80   

przekonwertować dataframe do NumPy użyciu df.values a następnie przekazać to do boxplot.

Kiedy próbuję wykreślić boxplot z tej pandasowej ramki danych, liczba wartości wybranych z każdej kolumny jest ograniczona do najmniejszej liczby wartości w kolumnie (w tym przypadku kolumnie F). Czy istnieje sposób, w jaki mogę umieścić wszystkie wartości z każdej kolumny?

UWAGA: Korzystam z df.dropna, aby upuszczać wiersze w każdej kolumnie z brakującymi wartościami. Zmienia to jednak rozmiar ramki danych na najniższy wspólny mianownik długości kolumny i zakłóca drukowanie.

import prettyplotlib as ppl 
import numpy as np 
import pandas 
import matplotlib as mpl 
from matplotlib import pyplot 

df = pandas.DataFrame.from_csv(csv_data,index_col=False) 
df = df.dropna() 
labels = ['A', 'B', 'C', 'D', 'E', 'F'] 
fig, ax = pyplot.subplots() 
ppl.boxplot(ax, df.values, xticklabels=labels) 
pyplot.show() 
+0

należy opublikować kod numpy/pandy – mrKelley

+0

kod dodaną. Ok, widzę, co się dzieje. Używam df.dropna, aby upuszczać wiersze w każdej kolumnie z brakującymi wartościami. Zmienia to jednak rozmiar ramki danych na najniższy wspólny mianownik długości kolumny i zakłóca drukowanie. Jakieś rozwiązania? – user308827

+1

Co powiesz na to, aby nie upuścić NaN? Myślę, że 'boxplot' będzie sam obsługiwał wartości NaN. – HYRY

Odpowiedz

6

Właściwy sposób, aby to zrobić, oszczędzając od wymyślania koła, byłoby użyć .boxplot() w pandas, gdzie nan obsługiwane prawidłowo:

In [31]: 

print df 
     A  B  C  D  E  F 
0 0.43 0.52 0.96 1.17 1.17 2.85 
1 0.43 0.52 1.17 2.72 2.75 2.94 
2 0.43 0.53 1.48 2.85 2.83 NaN 
3 0.47 0.59 1.58 NaN 3.14 NaN 
4 0.49 0.80 NaN NaN NaN NaN 

[5 rows x 6 columns] 
In [32]: 

_=plt.boxplot(df.values) 
_=plt.xticks(range(1,7),labels) 
plt.savefig('1.png') #keeping the nan's and plot by plt 

enter image description here

In [33]: 

_=df.boxplot() 
plt.savefig('2.png') #keeping the nan's and plot by pandas 

enter image description here

In [34]: 

_=plt.boxplot(df.dropna().values) 
_=plt.xticks(range(1,7),labels) 
plt.savefig('3.png') #dropping the nan's and plot by plt 

enter image description here

+0

dzięki, spróbuję tego. Co to jest - = przed jakimś kodem? – user308827

+0

To tłumi bezużyteczne dane wyjściowe w terminalu. Widzisz, 'plt.boxplot' zwróci listę 3 elementów. 'plt.xticks' zwróci kilka obiektów tyknięć. –

+0

świetnie, to działa, dziękuję! – user308827

Powiązane problemy