我有一个数据框形式的相关矩阵.就像是:
xyz abc def
xyz 1 0.1 -0.2
abc 0.1 1 0.3
def -0.2 0.3 1
我需要能够选择高于或低于某个阈值的所有值,但是它们当然可以在任何行或列中.
例如,选择所有大于0.2的值.有两个结果:
(def,abc)和(abc,def)
我不确定如何执行此操作,因为它涉及根据每行/每列中的条件搜索值.理想情况下,输出应采用易于识别对的格式(例如:元组列表或类似内容)
编辑:哦,当然,所有相同的列/行也将出现在上述示例的结果中(即:xyz / xyz,abc / abc,def / def)
最佳答案
这是使用np.triu掩盖上三角矩阵并按堆栈重塑相关矩阵的一种方法.
import pandas as pd
import numpy as np
# simulate some data to generate corr_mat
# ==============================================
np.random.seed(0)
data = np.random.multivariate_normal([0,0,0], [[1,0.1,-0.2],[0.1,1,0.3],[-0.2,0.3,1]], 10000)
df = pd.DataFrame(data, columns='xyz abc def'.split())
corr_mat = df.corr()
corr_mat
xyz abc def
xyz 1.0000 0.1216 -0.1901
abc 0.1216 1.0000 0.3014
def -0.1901 0.3014 1.0000
# processing
# =======================================
# mask on lower-triangle only
mask = np.ones_like(corr_mat, dtype=np.bool)
mask[np.triu_indices_from(mask)] = False
mask
array([[False, False, False],
[ True, False, False],
[ True, True, False]], dtype=bool)
# reshape the correlation matrix, and select corr > 0.2
corr_stacked = corr_mat.stack()
corr_stacked[(corr_stacked > 0.2) & (mask.ravel())]
def abc 0.3014
dtype: float64
# you can reset_index to put multi-level index to columns