Устранение выбросов после выполнения группы - PullRequest
0 голосов
/ 25 апреля 2020

Это мой первый пост, поэтому, пожалуйста, успокойтесь.

Я пытаюсь построить диаграмму для ожидаемой продолжительности жизни каждой страны с 2000 по 2015 год. Мой файл CSV содержит каждую страну 16 раз, по 1 в год. Я нарисовал коробку, используя df.boxplot(by=['Country'], column='Life Expectancy'), и из этого я смог увидеть выбросы для ожидаемой продолжительности жизни. Я также смог получить квантиль для каждой страны по этому Q1 = df.groupby('Country')['Life Expectancy'].quantile(0.25) Q3 = df.groupby('Country')['Life Expectancy'].quantile(0.75). Я просмотрел много учебных пособий, но ни один из них не использовал групповку, поэтому я застрял и не уверен, что делать дальше. Любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Если вы пытаетесь удалить выбросы, я бы использовал zscore вместо квантили

from scipy import stats

df['outlier'] = (np.abs(stats.zscore(df['Life Expectancy'])) >= 3) # replace 3 with a threshold of your choice
new_df= df[df['outlier']==False].copy()

Но так как вы хотите сделать это для объекта groupby, вы можете использовать

df.groupby('Country')['Life Expectancy'].transform(lambda x : stats.zscore(x,ddof=1))
1 голос
/ 25 апреля 2020

Определите функцию, которая будет возвращать фрейм данных с привязкой upper и lower, при условии, что вам нужен только IQR, groupby, затем рассчитайте IQR, назначьте эти столбцы для df, наконец, выполните запрос где значения не являются выбросами:

def fun(serie):
    return pd.DataFrame([[serie.quantile(0.25), serie.quantile(0.75)]]
                             *serie.shape[0], 
                        columns=['lower', 'upper'], 
                        index=serie.index)

df[['lower', 'upper']] = df.groupby('Country')['Life Expectancy'].apply(fun)

df = df.query('lower <= `Life Expectancy` <= upper')
    .drop(columns=['lower', 'upper'])
...