Pandas: 如何从相关矩阵中删除自相关

17

我正在尝试使用pandas查找不同列之间的最高相关性。我知道可以使用以下方法获取相关矩阵

df.corr()

我知道在那之后我可以得到最高的相关性

df.sort() 
df.stack() 
df[-5:]

问题在于这些相关性还包含了自己与自己的值(1)。我该如何删除这些包含自相关的列?我知道可以通过删除所有1值来删除它们,但我不想这样做,因为可能存在实际的1相关性。

4个回答

13

假设你有

corrs = df.corr()

那么问题在于对角线元素,如果我理解的没错。您可以轻松地将它们设置为某个负值,比如-2(这必然会低于所有相关项),方法如下:

np.fill_diagonal(corrs.values, -2)

示例

(感谢 @Fabian Rost 的改进和 @jezrael 提供的 DataFrame)

import numpy as np
df=pd.DataFrame( {
    'one':[0.1, .32, .2, 0.4, 0.8], 
    'two':[.23, .18, .56, .61, .12], 
    'three':[.9, .3, .6, .5, .3], 
    'four':[.34, .75, .91, .19, .21], 
    'zive': [0.1, .32, .2, 0.4, 0.8], 
    'six':[.9, .3, .6, .5, .3],
    'drive':[.9, .3, .6, .5, .3]})
corrs = df.corr()
np.fill_diagonal(corrs.values, -2)
>>> corrs
    drive   four    one six three   two zive
drive   -2.000000   -0.039607   -0.747365   1.000000    1.000000    0.238102    -0.747365
four    -0.039607   -2.000000   -0.489177   -0.039607   -0.039607   0.159583    -0.489177
one -0.747365   -0.489177   -2.000000   -0.747365   -0.747365   -0.351531   1.000000
six 1.000000    -0.039607   -0.747365   -2.000000   1.000000    0.238102    -0.747365
three   1.000000    -0.039607   -0.747365   1.000000    -2.000000   0.238102    -0.747365
two 0.238102    0.159583    -0.351531   0.238102    0.238102    -2.000000   -0.351531
zive    -0.747365   -0.489177   1.000000    -0.747365   -0.747365   -0.351531   -2.000000

你也可以有负相关值。因此,最好将它们设置为小于-1的值。 - Fabian Rost
1
也许您可以添加样本 df=pd.DataFrame( {'one':[0.1, .32, .2, 0.4, 0.8], 'two':[.23, .18, .56, .61, .12], 'three':[.9, .3, .6, .5, .3], 'four':[.34, .75, .91, .19, .21], 'zive': [0.1, .32, .2, 0.4, 0.8], 'six':[.9, .3, .6, .5, .3], 'drive':[.9, .3, .6, .5, .3]}) - jezrael
谢谢!我不知道 fill_diagonal。这个很好地解决了问题。 - mikkom
1
我想我会将它们设置为NaN,然后删除所有的NaN。 - mikkom
@mikkom,好主意,据我所知,NaN会排在底部。 - Michel de Ruiter

9

我最近发现了一个更简洁的答案来回答我的问题,你可以通过值来比较多重索引级别。

这就是我最终使用的方法。

corr = df.corr().stack()
corr = corr[corr.index.get_level_values(0) != corr.index.get_level_values(1)]

1

应填充NaN而不是伪造的数字

import numpy as np
np.fill_diagonal(corr_matrix.values, np.nan) # automatically inplace

NaN被seaborn和plotly相关矩阵所支持。


0

另一个解决方案是使用堆栈。

s = corr.stack(-1)
# remove where corr is 1 
s = s[s != 1]
# convert to matrix again
s.unstack()

或者

corr.values[np.tril_indices_from(corr.values, k=0)] = np.nan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接