2013-09-02 22 views
19

Mam pandę DataFrame o nazwie data z kolumną o nazwie ms. Chcę wyeliminować wszystkie wiersze, w których data.ms jest powyżej percentyla 95%. Na razie robię to:Eliminowanie wszystkich danych z danego percentyla

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

który działa, ale chcę uogólnić to do dowolnego percentyla. Jaki jest najlepszy sposób na zrobienie tego?

Odpowiedz

41

użyć metody Series.quantile():

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 

Aby odfiltrować wiersze z df gdzie df.a jest większa lub równa 95. percentyla zrobić:

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

użyciu pandy, jeśli chcę porównać różne kol ze szczególnym kwantyl, istnieje szybka metoda podobna nadawanie numpy? –

+0

działa również przy usuwaniu wszystkich kolumn, tj. 'Df [df

12

numpy jest znacznie szybsze niż Pandy za to Rodzaj rzeczy:

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

jest równoważny ale 3 razy szybciej niż:

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

więc na kodzie, to daje:

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