Исключая все данные выше процентиля для разных категорий - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть фрейм данных с разными категориями, и я хочу исключить все значения, превышающие данный процентиль для каждой категории.

d = {'cat': ['A', 'B', 'A', 'A', 'C', 'C', 'B', 'A', 'B', 'C'],
     'val': [1, 2, 4, 2, 1, 0, 9, 8, 7, 7]}

df = pd.DataFrame(data=d)

  cat  val
0  A    1
1  B    2
2  A    4
3  A    2
4  C    1
5  C    0
6  B    9
7  A    8
8  B    7
9  C    7

Так, например, исключение процентиля 0,95 должно привести к:

  cat  val
0  A    1
1  B    2
2  A    4
3  A    2
4  C    1
5  C    0
8  B    7

потому что у нас есть:

>>> df[df['cat']=='A'].quantile(0.95).item()
7.399999999999999

>>> df[df['cat']=='B'].quantile(0.95).item()
8.8

>>> df[df['cat']=='C'].quantile(0.95).item()
6.399999999999999

На самом деле существует много категорий, и мне нужен аккуратный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вы можете использовать функцию quantile в сочетании с groupby:

df.groupby('cat')['val'].apply(lambda x: x[x < x.quantile(0.95)]).reset_index().drop(columns='level_1')
0 голосов
/ 17 февраля 2019

Я придумал следующее решение:

idx = [False] * df.shape[0]
for cat in df['cat'].unique():
    idx |= ((df['cat']==cat) & (df['val'].between(0, df[df['cat']==cat ].quantile(0.95).item())))

df[idx]  

, но было бы неплохо увидеть другие решения (надеюсь, лучшие).

...