假设我有一个类似于下面的数据框,我如何得到2个特定列之间的相关性,然后按“ID'”进行分组。柱?我相信熊猫' corr' method查找所有列之间的相关性。如果可能的话,我也想知道如何找到' groupby'使用.agg函数(即np.correlate)进行相关。
我有什么:
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
谢谢!
答案 0 :(得分:17)
你几乎想出了所有的部分,只需要将它们结合起来:
>>> 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个或更多变量,创建简洁输出并不简单,但您可以这样做:
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中的上三角函数或下三角函数。但是既然存在这个元素,就我所知,以更优雅的方式制作简洁的输出并不容易。
答案 1 :(得分:2)
在上述答案中;由于ix已贬值,因此请使用iloc并进行一些其他小的更改:
df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2][['Val2']] # to get pandas DataFrame
或
df.groupby('ID')[['Val1','Val2']].corr().iloc[0::2]['Val2'] # to get pandas Series
答案 2 :(得分:1)
另一个简单的解决方案:
df.groupby('ID')[['Val1','Val2']].corr().unstack().iloc[:,1]