2013-09-02 2 views
19

У меня есть pandas DataFrame под названием data с колонкой ms. Я хочу исключить все строки, где data.ms выше 95% процентиля. На данный момент я делаю это:Устранение всех данных по данному процентилю

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

который работает, но я хочу обобщить это на любой процентиль. Каков наилучший способ сделать это?

ответ

41

Используйте 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 

Чтобы отфильтровать строки из df где df.a больше или равно 95-й процентиль сделать:

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

с помощью панд, если я хочу сравнивать различные седловины с определенными квантилями, есть быстрый способ, подобный NumPy вещание? –

+0

также работает при удалении по всем столбцам, то есть 'df [df

12

NumPy гораздо быстрее, чем панд для этого вид вещей:

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

эквивалентно, но в 3 раза быстрее, чем:

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

так для вашего кода, это дает:

df[df.a < np.percentile(df.a,95)] 
Смежные вопросы