Удаление всех данных за заданный процентиль

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

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

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


person Roy Smith    schedule 02.09.2013    source источник


Ответы (2)


Используйте метод 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
person Phillip Cloud    schedule 02.09.2013
comment
используя pandas, если я хочу сравнить разные col с конкретным квантилем, есть ли быстрый метод, похожий на широковещательную передачу numpy? - person Pengju Zhao; 28.07.2017
comment
он также работает при удалении по всем столбцам, т.е. df[df < df.quantile(.95)]? Я ожидаю, что все значения будут отфильтрованы, если они не находятся в диапазоне, и при необходимости заменены на NaN. - person Mattia Paterna; 23.11.2017
comment
В принципе то же самое, но более лаконично: df.query('a < a.quantile(.95)'). Если имя столбца длинное, это может улучшить читаемость: col = 'some_verbose_metric_name'; df.query(f'{col} < {col}.quantile(.95)') - person ribitskiyb; 17.10.2019

numpy намного быстрее, чем Pandas для таких вещей:

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)]
person 2diabolos.com    schedule 01.09.2016
comment
Можно подтвердить, что реализация numpy работает быстрее, если вы можете позволить себе стоимость извлечения столбца - person deepelement; 17.10.2018
comment
@ 2diabolos.com есть способ реализовать фильтр процентилей для нескольких столбцов pandas. - person Furqan Hashim; 04.03.2019
comment
Что-то вроде df [numpy.logical_and (df.a ‹np.percentile (df.a, 95), df.b‹ np.percentile (df.b, 95))]? Или вы можете создать для этого новый вопрос ... - person 2diabolos.com; 11.03.2019
comment
@deepelement какова компромисс со стоимостью извлечения столбца? - person Fred Zimmerman; 07.12.2020