Pandas 按变换协方差进行分组

Pandas 按变换协方差进行分组,pandas,Pandas,我的数据帧: 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','

我的数据帧:

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

我缺少什么?

我认为您需要以稍微不同的方式指定列:

>>> 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)来降低速度。这到底是怎么回事
A['value2']
是整个原始序列,所以我们可以通过,因为
x
被重新编制索引并填充
NaN
,在这种情况下,它可以工作,因为
NaN
不会改变协方差,所以我们有效地只在组内计算它?是的,我冒昧地称之为@ALollz有点不直观-它似乎没有遵循如何在groupby对象上调用东西的常规。乍一看,我会认为
a.groupby('group').transform(lambda-df:df['value1'].cov(a['value2'])
将是解决方案,因为
a.groupby('group')中的每个“group”都是
是一个具有3个原始列的数据帧。是的,我认为需要使用transform
lambda,因为它确实不能跨列运行。一般来说,我习惯于这样的事情:
my_cov=lambda gp:gp.cov(A.loc[gp.index,'value2'])
,所以它只在组内起作用。但是对于cov
NaN
处理,它似乎在没有子集的情况下工作。