группа панд по удалению выбросов - PullRequest
0 голосов
/ 17 мая 2018

Я хочу удалить выбросы на основе значений процентиля 99 по группам.

 import pandas as pd
 df = pd.DataFrame({'Group': ['A','A','A','B','B','B','B'], 'count': [1.1,11.2,1.1,3.3,3.40,3.3,100.0]})

в выводе я хочу удалить 11.2 из группы A и 100 из группы b. поэтому в окончательном наборе данных будет только 5 наблюдений.

wantdf = pd.DataFrame({'Group': ['A','A','B','B','B'], 'count': [1.1,1.1,3.3,3.40,3.3]})

Я пробовал это, но я не получаю желаемых результатов

df[df.groupby("Group")['count'].transform(lambda x : (x<x.quantile(0.99))&(x>(x.quantile(0.01)))).eq(1)]

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вот мое решение:

def is_outlier(s):
    lower_limit = s.mean() - (s.std() * 3)
    upper_limit = s.mean() + (s.std() * 3)
    return ~s.between(lower_limit, upper_limit)

df = df[~df.groupby('Group')['count'].apply(is_outlier)]

Вы можете написать свою собственную функцию is_outlier

0 голосов
/ 18 мая 2018

Я не думаю, что вы хотите использовать квантиль, так как вы исключите свои более низкие значения:

import pandas as pd
df = pd.DataFrame({'Group': ['A','A','A','B','B','B','B'], 'count': [1.1,11.2,1.1,3.3,3.40,3.3,100.0]})
print(pd.DataFrame(df.groupby('Group').quantile(.01)['count']))

выход:

       count
Group       
A        1.1
B        3.3

Это не выбросы, верно? Таким образом, вы не хотели бы исключать их.

Вы могли бы попробовать установить левый и правый пределы, используя стандартные отклонения от медианы, может быть? Это немного многословно, но дает правильный ответ:

left = pd.DataFrame(df.groupby('Group').median() - pd.DataFrame(df.groupby('Group').std()))
right = pd.DataFrame(df.groupby('Group').median() + pd.DataFrame(df.groupby('Group').std()))

left.columns = ['left']
right.columns = ['right']

df = df.merge(left, left_on='Group', right_index=True)
df = df.merge(right, left_on='Group', right_index=True)

df = df[(df['count'] > df['left']) & (df['count'] < df['right'])]
df = df.drop(['left', 'right'], axis=1)
print(df)

выход:

  Group  count
0     A    1.1
2     A    1.1
3     B    3.3
4     B    3.4
5     B    3.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...