удаление выбросов на основе двух столбцов в кадре данных - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть следующий фрейм данных:

Year Month Equipment   Weight
2017 1     TennisBall  5
2017 1     Football    4
2017 1     TennisBall  6
2017 1     TennisBall  7
2017 1     TennisBall  300
2017 2     TennisBall  300
2018 2     TennisBall  250
2018 2     Football    5
2018 2     TennisBall  6
2018 2     TennisBall  275
...

В приведенном выше примере для нас нормально отгрузить 300 единиц теннисных мячей только в феврале, сделав таким образом порядка 6 единицвыброс, тогда как в январе обычная сумма составляет ~ 5, что делает любые крупные заказы в этом месяце выбросом.Я хотел бы отбросить выбросы в зависимости от веса в месяц.Есть ли простой способ сделать это?Я знаю, что могу сделать что-то вроде:

df1[np.abs(df1.Weight-df1.Weight.mean()) <= (5*df1.Weight.std())]

, чтобы взять что-нибудь с весом в пределах 5 отклонений от среднего, но это не будет учитывать часть за месяц, где я могу видеть драматическиесдвиги в весе из-за того, что месяц.Спасибо!

Редактировать: Например, желаемый результат будет примерно таким:

Year Month Equipment   Weight
2017 1     TennisBall  5
2017 1     Football    4
2017 1     TennisBall  6
2017 1     TennisBall  7

2017 2     TennisBall  300
2018 2     TennisBall  250
2018 2     Football    5

2018 2     TennisBall  275
...

Где в январе был удален выброс в 300 (как в январе это выше нормы)и в феврале выброс 6 был удален (это было бы нормой в январе, но, как это случилось в феврале, это ненормально)

1 Ответ

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

Это проблема для группы.Вы можете решить эту проблему, создав два новых столбца, содержащие сгруппированные средние значения и стандартные отклонения, а затем отфильтровав эти столбцы:

# Calculate difference between Weight and mean of group
df['Weight diff'] = df['Weight'].sub(df.groupby(['Year','Month','Equipment'])['Weight'].transform('mean'))
# Calculate standard deviation of group
df['std'] = df.groupby(['Year','Month','Equipment'])['Weight'].transform('std')

# Consider columns satisfying condition
# Include or condition accounting for NaN's from single value groups
df = df.loc[(np.abs(df['Weight diff']) <= df['std']) | (df['std'].isnull())]

# Remove unnecessary columns
df = df.drop(['Weight diff', 'std'], axis=1)

>>> print(df)

0   Year Month   Equipment  Weight
1   2017     1  TennisBall       5
2   2017     1    Football       4
3   2017     1  TennisBall       6
4   2017     1  TennisBall       7
6   2017     2  TennisBall     300
7   2018     2  TennisBall     250
8   2018     2    Football       5
10  2018     2  TennisBall     275
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...