Pandas Correlation Groupby

bsh*_*ehy 20 python group-by correlation pandas

假设我有一个类似于下面的数据帧,我如何得到2个特定列之间的相关性,然后按"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
Run Code Online (Sandbox Code Playgroud)

我需要的:

ID  Correlation_Val1_Val2
A   0.12
B   0.22
C   0.05
Run Code Online (Sandbox Code Playgroud)

谢谢!

Joh*_*hnE 22

你几乎想出了所有的部分,只需要将它们结合起来:

>>> 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
Run Code Online (Sandbox Code Playgroud)

在您的情况下,为每个ID打印2x2是非常冗长的.我没有看到打印标量相关而不是整个矩阵的选项,但是如果你只有两个变量,你可以做这样简单的事情:

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

ID       
A   Val1    0.500000
B   Val1    0.385727
Run Code Online (Sandbox Code Playgroud)

对于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()
Run Code Online (Sandbox Code Playgroud)

请注意,如果我们没有该groupby元素,则可以直接使用numpy的上三角函数或下三角函数.但是既然存在这个元素,就我所知,以更优雅的方式制作简洁的输出并不容易.

  • 这是一个很好的答案。对于这种简单的事情,必须要弄乱.iloc这个事实,这确实使我对熊猫感到沮丧。如果我想建立一个大型的科学数据处理管道,最终感觉就像牙膏一样。 (6认同)

小智 7

一种更简单的解决方案:

df.groupby('ID')[['Val1','Val2']].corr().unstack().iloc[:,1]
Run Code Online (Sandbox Code Playgroud)


Rav*_*are 6

在上面的回答中;由于 ix 已被折旧,请使用 iloc 代替,并进行一些小的其他更改:

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

或者

df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2]['Val2'] # to get pandas Series
Run Code Online (Sandbox Code Playgroud)