Выберите значения из любого столбца / строки на основе критериев

У меня есть корреляционная матрица в виде кадра данных. Что-то вроде:

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)

Я не уверен, как это сделать, поскольку он предполагает поиск значений на основе критериев в каждой строке / столбце. В идеале вывод должен быть в формате, который легко идентифицирует пары (например: список кортежей или что-то в этом роде)

edit: oh, и, конечно, все одинаковые столбцы / строки будут также представлены в результатах приведенного выше примера (например, xyz / xyz, abc / abc, def / def)

Вот один из способов использования np.triu для маскировки верхней треугольной матрицы и преобразования матрицы корреляции по stack .

 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 

Сгладьте 2d-1d кортежей ((строка, col), val). Сортировать по val. retrieve (row, col) кортежей, val> 0.2

Предполагая, что ваш фреймворк «df», и ваш порог «value», вы можете сделать что-то вроде:

 df[df>value] or 

df[df>value].dropna(axis=1, how="all") если вы хотите удалить столбцы без совпадений.