首页 > 解决方案 > 如何在熊猫中选择相关性高于阈值的特征对?

问题描述

我有一个看起来像这样correlation matrix的数据框:pandas

import pandas as pd
foo = pd.DataFrame({'vars': ['col_a', 'col_b', 'col_c', 'col_d'],
                   'col_a': [1, 0.9, 0.04, 0.03],
                   'col_b': [0.9,1,0.05,0.03],
                   'col_c': [0.04, 0.05, 1, -0.04],
                   'col_d': [0.03, 0.03, -0.04,1]})

我想获得所有在绝对值上具有一定相关性并排除自相关性的唯一“对”threshold

所以,如果阈值是0.8,我应该得到这样的东西:

[('col_a', 'col_b')]

任何想法我怎么能做到这一点?

标签: pythonpython-3.xpandas

解决方案


您可以将 'vars' 设置为索引,stack并使用输出进行切片:

pairs = foo.set_index('vars').stack()
pairs[pairs.abs().gt(0.8)]

输出:

vars        
col_a  col_a    1.0
       col_b    0.9
col_b  col_a    0.9
       col_b    1.0
col_c  col_c    1.0
col_d  col_d    1.0

作为列表:

pairs = foo.set_index('vars').stack()
list(pairs[pairs.gt(0.8)].index)
[('col_a', 'col_a'), ('col_a', 'col_b'), ('col_b', 'col_a'), ('col_b', 'col_b'), ('col_c', 'col_c'), ('col_d', 'col_d')]

如果您只想获得唯一的对(例如,B vs A == A vs B)并放弃自相关(例如,A vs A),请使用此替代方法。

np.triu可以只保留相关矩阵中的一个三角形,并且该k参数允许移动对角线(k=0保留对角线,k=1删除对角线,因此如果要保持自相关,请使用k=0

import numpy as np
foo = foo.set_index('vars')
pairs = foo.where(np.triu(foo, k=1).astype(bool)).stack()
list(pairs[pairs.abs().gt(0.8)].index)

输出:

[('col_a', 'col_b')]

推荐阅读