2013-09-02 24 views
19

Ich habe eine Pandas DataFrame namens data mit einer Spalte namens ms. Ich möchte alle Zeilen eliminieren, in denen data.ms über dem 95% Perzentil liegt. Denn jetzt mache ich das:Eliminierung aller Daten über ein bestimmtes Perzentil

limit = data.ms.describe(90)['95%'] 
valid_data = data[data['ms'] < limit] 

die funktioniert, aber ich möchte, dass zu jedem Perzentil verallgemeinern. Was ist der beste Weg, das zu tun?

Antwort

41

die Series.quantile() Methode verwenden:

In [48]: cols = list('abc') 

In [49]: df = DataFrame(randn(10, len(cols)), columns=cols) 

In [50]: df.a.quantile(0.95) 
Out[50]: 1.5776961953820687 

Um Reihen von df herauszufiltern, wo df.a größer oder gleich dem 95. Perzentil ist zu tun:

In [72]: df[df.a < df.a.quantile(.95)] 
Out[72]: 
     a  b  c 
0 -1.044 -0.247 -1.149 
2 0.395 0.591 0.764 
3 -0.564 -2.059 0.232 
4 -0.707 -0.736 -1.345 
5 0.978 -0.099 0.521 
6 -0.974 0.272 -0.649 
7 1.228 0.619 -0.849 
8 -0.170 0.458 -0.515 
9 1.465 1.019 0.966 
+0

Pandas verwenden, wenn ich verschiedene col mit bestimmten Quantil vergleichen wollen, gibt es eine schnelle Methode ähnlich numpy Rundfunk? –

+0

funktioniert es auch beim Entfernen über alle Spalten, d. H. 'Df [df

12

numpy ist viel schneller als Pandas für diese Art der Dinge:

numpy.percentile(df.a,95) # attention : the percentile is given in percent (5 = 5%) 

ist gleichwertig, aber 3 mal schneller als:

df.a.quantile(.95) # as you already noticed here it is ".95" not "95" 

so für Ihren Code, gibt es:

df[df.a < np.percentile(df.a,95)] 
Verwandte Themen