Панды группового преобразования ковариации - PullRequest
0 голосов
/ 07 ноября 2018

Мой DataFrame:

A = pd.DataFrame({'group':['A','A','A','A','B','B','B'],
              'value1':[1,2,3,4,5,6,7],
              'value2':[8,5,4,3,7,8,8]})

Мне бы хотелось иметь новый столбец ковариации, который показывает ковариацию между [value1, value2] на уровне группы для каждого наблюдения.

Поэтому я попытался:

A['covariance'] = A.groupby('group')[['value1','value2']].transform(lambda x: x['value1'].cov(x['value2']),axis=1)

Но это приводит к ошибке:

TypeError: Transform function invalid for data types

Чего мне не хватает?

1 Ответ

0 голосов
/ 07 ноября 2018

Полагаю, вам нужно указать столбцы немного по-другому:

>>> A.groupby('group')['value1'].transform(lambda x: x.cov(A['value2']))
0   -2.666667
1   -2.666667
2   -2.666667
3   -2.666667
4    0.500000
5    0.500000
6    0.500000

Это работает как:

>>> for _, frame in A.groupby('group'):
...     print(frame['value1'].cov(frame['value2']))
... 
-2.6666666666666665
0.5

Примечание: я нахожу этот синтаксис немного запутанным, потому что A.groupby('group') является итератором для кортежей ('group', 'df'). Но я думаю, что это связано с тем, что

Функция преобразования должна: работать столбец за столбцом в группе Кусок. Преобразование применяется к первому фрагменту группы, используя chunk.apply. (источник)

И, как правило, добавление lambda внутрь вызова может ( может , но не всегда) замедлять работу, помещая вычисления в пространство Python (а не в Cython).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...