Pandas:如何从相关矩阵中删除自相关
Pandas: How to drop self correlation from correlation matrix
我正在尝试查找与 pandas 的不同列的最高相关性。我知道可以用
得到相关矩阵
df.corr()
我知道在那之后我可以获得最高的相关性
df.sort()
df.stack()
df[-5:]
问题是这些相关性还包含列本身 (1) 的列值。如何删除这些包含与自我相关的列?我知道我可以通过删除所有 1 个值来删除它们,但我不想这样做,因为也可能存在实际的 1 个相关性。
假设你有
corrs = df.corr()
那么问题出在对角线元素,IIUC。您可以轻松地将它们设置为某个负值,例如 -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
我最近找到了更清晰的问题答案,您可以按值比较多索引级别。
这是我结束使用的。
corr = df.corr().stack()
corr = corr[corr.index.get_level_values(0) != corr.index.get_level_values(1)]
我正在尝试查找与 pandas 的不同列的最高相关性。我知道可以用
得到相关矩阵df.corr()
我知道在那之后我可以获得最高的相关性
df.sort()
df.stack()
df[-5:]
问题是这些相关性还包含列本身 (1) 的列值。如何删除这些包含与自我相关的列?我知道我可以通过删除所有 1 个值来删除它们,但我不想这样做,因为也可能存在实际的 1 个相关性。
假设你有
corrs = df.corr()
那么问题出在对角线元素,IIUC。您可以轻松地将它们设置为某个负值,例如 -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
我最近找到了更清晰的问题答案,您可以按值比较多索引级别。
这是我结束使用的。
corr = df.corr().stack()
corr = corr[corr.index.get_level_values(0) != corr.index.get_level_values(1)]