Используйте пользовательскую функцию (Median Absolute Deviation) в Pandas `transform ()` - PullRequest
1 голос
/ 26 апреля 2020

У меня есть pandas фрейм данных, для которого я хочу вычислить абсолютное отклонение MEDIAN по кластерам. Я предположил, что pandas метод mad был Медианным Абсолютным Отклонением, но, похоже, это СРЕДНЕЕ Абсолютное Отклонение. Написанная мною строка кода

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('mad')

Я попытался написать небольшую собственную функцию для вычисления Медианного абсолютного отклонения

def myMAD(x):
    med = np.median(x)
    x   = abs(x-med)
    MAD = np.median(x)
    return MAD

и изменить свой код на чтение

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('myMAD')

К сожалению, это не работает. Я получаю объект 'SeriesGroupBy' AttributeError, не имеющий атрибута 'myMAD'.

Как вычислить средние абсолютные отклонения по кластеру для столбца в моем фрейме данных и правильно создать новый столбец с MAD-трансляцией по строкам, используя преобразовать?

Заранее спасибо

Томас Филипс

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Вы близки, вам нужно myMAD вместо 'myMAD', потому что ваша пользовательская функция:

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform(myMAD)

РЕДАКТИРОВАТЬ:

Ваше решение возможно без вспомогательного столбца с группировкой по столбцу df['Cluster']:

s1 = df.groupby('Cluster')['PPGamp'].transform('median')
s2 = df['PPGamp'].sub(s1).abs()

df['MAD PPGamp'] = s2.groupby(df['Cluster']).transform('median')
0 голосов
/ 26 апреля 2020

Я нашел двухэтапное решение моей проблемы:

df['Abs Delta PPGamp']  = abs(df['PPGamp'] - df['Med PPGamp'])
df['MAD PPGamp'] = df.groupby('Cluster')['Abs Delta PPGamp'].transform('median')

Могу ли я тогда переформулировать свой вопрос следующим образом: Как я могу применить любой (разумный) определенный пользователем (или даже внутренний) к Python) функция для столбца информационного кадра при использовании groupby.

...