我的数据框:
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
我想念什么?
答案 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)中会使事情变慢