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个原始列的数据帧。是的,我认为需要使用transformlambda,因为它确实不能跨列运行。一般来说,我习惯于这样的事情:my_cov=lambda gp:gp.cov(A.loc[gp.index,'value2'])
,所以它只在组内起作用。但是对于covNaN
处理,它似乎在没有子集的情况下工作。