首页 > 解决方案 > 如何计算两个样本之间的相关性

问题描述

我正在尝试计算 DataFrame 类型中两个样本(行)之间的相关性。我发现了一些计算特征(列)之间相关性的代码,最终,它将矩阵转换为排序列表,然后删除与自身的相关性。我想要样品也一样。

correlations_all = train_df[features].corr().abs().unstack().sort_values(kind="quicksort").reset_index()

correlations_all = correlations_all[correlations_all['level_0'] != correlations_all['level_1']]

output:
level_0        level_1        0
var_0          var_1          0.50
var_0          var_4          0.45
var_10         var_4          0.4

那么如何在python中做到这一点?

标签: pythondataframecorrelation

解决方案


总而言之,你的答案是

pd.concat([df,df2],axis=1).T.corr().drop(range(0,df.shape[1]),axis=1)[0:df.shape[1]+1]

详细解释:

创建一个df

df = pd.DataFrame(np.random.randint(0, high=100, size=(10, 5)),columns=list('abcde'))
df2 = pd.DataFrame(np.random.randint(0, high=100, size=(10, 5)),columns=list('fghjk'))

输出:

>>> df
a   b   c   d   e
0  47  68  60   8  27
1  52  36  50   0  46
2  21  53  55  43   0
3  32  63  42  37  38
4  91  95  28  81  55
5  68  14  16   5  27
6  51   2  73   8  49
7   2  83  54  77  61
8  44  89  87  93  42
9  75  50  78  31  80

>>> df2
    f   g   h   j   k
0  40  62  68   2  24
1  55   9  64  37  39
2  18   5  11  14  79
3  36  14  39  11  66
4  63  95  87  49  81
5  29  20  76  32  90
6  19  48  13   0  81
7  79  55  32   8  17
8  93   3  33   7  53
9  85  30  50  14   2
corr() 

有一个corrwith()函数,第一个计算与另一个数据帧的相关性。

corr()在您的情况下更有用。而是corr()自己计算。因此,我们首先 concat 2 df。

输出:

>>>pd.concat([df,df2],axis=1)
    a   b   c   d   e   f   g   h   j   k
0  47  68  60   8  27  40  62  68   2  24
1  52  36  50   0  46  55   9  64  37  39
2  21  53  55  43   0  18   5  11  14  79
3  32  63  42  37  38  36  14  39  11  66
4  91  95  28  81  55  63  95  87  49  81
5  68  14  16   5  27  29  20  76  32  90
6  51   2  73   8  49  19  48  13   0  81
7   2  83  54  77  61  79  55  32   8  17
8  44  89  87  93  42  93   3  33   7  53
9  75  50  78  31  80  85  30  50  14   2

corr()方法计算列之间的相关性。要在行之间进行计算,首先进行转置并删除 df 中您不想看到的部分。

pd.concat([df,df2],axis=1).T.corr().drop(range(0,df.shape[1]),axis=1)[0:df.shape[1]+1]

输出:

pd.concat([df,df2],axis=1).T.corr().drop(range(0,df.shape[1]),axis=1)[0:df.shape[1]]
              5         6         7         8         9
    0  0.154824  0.161153 -0.006838 -0.301014 -0.125625
    1 -0.405248 -0.344024  0.413258  0.284815  0.367698
    2  0.146049 -0.390763  0.165186 -0.358735 -0.245411
    3 -0.018887 -0.084056 -0.239326  0.061516  0.488869
    4 -0.338686  0.256093  0.455395  0.741626 -0.130878

提取单行

def compute_corr(df,i):
    print(f"Correlation between {i}'th sample and other samples")
    return df.T.corr().loc[i]

输出:

x= pd.concat([df,df2],axis=1).T.corr().drop(range(0,6),axis=1)
compute_corr(x,0)
Correlation between 0'th sample and other samples
0    1.000000
1    0.590134
2   -0.983648
3   -0.894758
4   -0.463191   
Name: 0, dtype: float64

我希望这次代码是您的需要。


推荐阅读