Какой самый эффективный способ группового исключения? - PullRequest
0 голосов
/ 24 февраля 2020

Допустим, у меня есть такой фрейм данных

channel | ID | cnt_txn | amount
   A    |  1 |    3    |  15
   A    |  2 |    5    |  20
   B    |  1 |    4    |  12
   C    |  3 |    3    |  12
   C    |  2 |    10   |  10

, и у меня есть эта функция

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)

Какой самый простой и удобный способ группировки по каналу и применения is_outlier (или Аналогично функции logi c) для каждого из данных в группе по каналу

Я попытался

df.groupby(['vertical'])['cnt_txn','amount'].apply(is_outlier)

, что привело к

AttributeError: ' DataFrame 'У объекта нет атрибута' между '

Я предполагаю, что он не зацикливал каждый столбец в кадре данных

Если кто-то может объяснить это и предложить решение, было бы очень оценил, спасибо заранее

1 Ответ

0 голосов
/ 24 февраля 2020

Согласно Насколько нам известно, спасибо @Phung Duy Phong за указание на логи c.

, прикольное веселье c должно выглядеть так, чтобы ускорить производительность в групповом * 1004. *

def is_outlier(x):
    return (x<x.quantile(0.95))&(x>(x.quantile(0.05)))

и оператор groupby должен выглядеть следующим образом

df[df.groupby(['channel'])['cnt_txn','amount'].apply(is_outlier).eq(1).all(axis=1)]

отметил, что .eq(1) упрощает результат до True и False вместо значения Nan

и .all(axis=1) предназначены для объединения возвращаемого массива в одно измерение, в котором все столбцы должны иметь значение true, равное true

и, наконец, df[arrayOfTrueFalse] вернет кадр данных без выброса

...