Python 熊猫相关分组

Python 熊猫相关分组,python,pandas,group-by,correlation,Python,Pandas,Group By,Correlation,假设我有一个与下面类似的数据帧,我如何获得两个特定列之间的相关性,然后按“ID”列进行分组?我相信Pandas'corr'方法可以找到所有列之间的相关性。如果可能,我还想知道如何使用.agg函数(即np.correlate)找到“groupby”相关性 我所拥有的: ID Val1 Val2 OtherData OtherData A 5 4 x x A 4 5 x x A 6

假设我有一个与下面类似的数据帧,我如何获得两个特定列之间的相关性,然后按“ID”列进行分组?我相信Pandas'corr'方法可以找到所有列之间的相关性。如果可能,我还想知道如何使用.agg函数(即np.correlate)找到“groupby”相关性

我所拥有的:

ID  Val1    Val2    OtherData   OtherData
A   5       4       x           x
A   4       5       x           x
A   6       6       x           x
B   4       1       x           x
B   8       2       x           x
B   7       9       x           x
C   4       8       x           x
C   5       5       x           x
C   2       1       x           x
我需要的是:

ID  Correlation_Val1_Val2
A   0.12
B   0.22
C   0.05

谢谢

你基本上把所有的部分都弄清楚了,只需要把它们组合起来:

>>> df.groupby('ID')[['Val1','Val2']].corr()

             Val1      Val2
ID                         
A  Val1  1.000000  0.500000
   Val2  0.500000  1.000000
B  Val1  1.000000  0.385727
   Val2  0.385727  1.000000
在您的情况下,为每个ID打印一个2x2是非常冗长的。我看不到打印标量关联而不是整个矩阵的选项,但如果只有两个变量,则可以执行如下简单操作:

>>> df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2,-1]

ID       
A   Val1    0.500000
B   Val1    0.385727
对于3+变量的更一般情况 对于3个或更多变量,创建简明输出并不简单,但您可以这样做:

groups = list('Val1', 'Val2', 'Val3', 'Val4')
df2 = pd.DataFrame()
for i in range( len(groups)-1): 
    df2 = df2.append( df.groupby('ID')[groups].corr().stack()
                        .loc[:,groups[i],groups[i+1]:].reset_index() )

df2.columns = ['ID', 'v1', 'v2', 'corr']
df2.set_index(['ID','v1','v2']).sort_index()

请注意,如果我们没有
groupby
元素,那么可以直接使用numpy中的上三角函数或下三角函数。但由于存在该元素,就我所知,以更优雅的方式生成简洁的输出并不容易;由于ix已贬值,因此使用iloc代替,并进行一些较小的其他更改:

df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2][['Val2']] # to get pandas DataFrame


还有一个简单的解决方案:

df.groupby('ID')[['Val1','Val2']].corr().unstack().iloc[:,1]

如何将其更改为“rolling_corr()”,以便每10天计算一次滚动相关性?这是一个很好的答案。事实上,要做这么简单的事情,就必须搞乱
.iloc
s,这是熊猫真正让我沮丧的事情之一;如果我想为科学数据建立一个大型的处理管道,我最终会感觉一切都像牙膏一样。啊,太奇怪了,我基本上和你同时做了同样的编辑。我们用了稍微不同的方法,所以我将保持我的原样,同时+1这个。
df.groupby('ID')[['Val1','Val2']].corr().unstack().iloc[:,1]