熊猫groupby变换协方差

时间:2018-11-07 15:03:15

标签: 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','value2']].transform(lambda x: x['value1'].cov(x['value2']),axis=1)

但这会导致错误:

TypeError: Transform function invalid for data types

我想念什么?

1 个答案:

答案 0 :(得分:3)

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

>>> 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。 (source)

作为一种披露,通常,在调用内部抛出lambda可能会(但并非总是如此)(通过可能,但并非总是如此),将计算放在Python空间(而不是Cython)中会使事情变慢