2015-07-31 3 views
3

У меня есть матрица корреляции в виде кадра данных. Что-то вроде:Выберите значения из любого столбца/строки на основе критериев

 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, DEF)

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

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

+0

Но не является ли значение '1' также не выше' 0,2'? Значит, вы не хотите выбирать этот? – Tenzin

+0

Я бы пошел на цикл сначала по горизонтали, а в этом цикле вы переходите по вертикальной линии. – Tenzin

+0

На самом деле я их не хочу. Однако, если они включены в список кортежей, я могу затем отфильтровать их в этой точке. Часть, с которой я сталкиваюсь, выдает значения из фрейма данных. – darkpool

ответ

2

Вот один из способов использования 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 
1

Сгладить 2d-1d кортежей ((строка, col), val). Сортировать по val. извлечения (строка, столбец) кортежей, чьи значения> 0,2

+1

Спасибо, похоже, что это сработает, но я не уверен, как получить 1d кортежей ((строка, col), val). Я попробовал список (df.itertuples()) – darkpool

+1

to_dict (* args, ** kwargs) \t Преобразование DataFrame в словарь. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html – kchoi

1

Если предположить, что dataframe является «ДФ» и ваш порог «значение» вы могли бы сделать что-то вроде:

df[df>value] or 

если вы хотите, чтобы удалить столбцы без совпадений.

Смежные вопросы