2016-02-15 10 views
6

Próbuję znaleźć najwyższe korelacje dla różnych kolumn z pandami. Wiem, że można uzyskać macierz korelacji zPandy: Jak upuścić własną korelację z macierzy korelacji

df.corr() 

wiem, że mogę dostać najwyższe korelacje potem z

df.sort() 
df.stack() 
df[-5:] 

Problem polega na tym, że te korelacja zawierać również wartości dla kolumny z samej kolumnie (1) . Jak usunąć te kolumny, które zawierają korelację ze sobą? Wiem, że mogę je usunąć, usuwając wszystkie 1 wartości, ale nie chcę tego robić, ponieważ mogą istnieć również rzeczywiste 1 korelacje.

Odpowiedz

8

Say masz

corrs = df.corr() 

to problem jest z elementów diagonalnych, IIUC. Można łatwo ustawić je w pewnym ujemnej wartości, powiedzmy -2 (który koniecznie będzie niższa niż wartość wszystkich korelacji) z

np.fill_diagonal(corrs.values, -2) 

przykładu

(wiele dzięki @Fabian Rost dla osób poprawa & @jezrael dla 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 
+0

Można również uzyskać ujemne wartości korelacji. Więc lepiej byłoby ustawić je na wartość mniejszą niż -1. –

+1

@FabianRost To jest doskonały punkt. Zaktualizuję. Dzięki! –

+1

Być może możesz dodać próbkę 'df = pd.DataFrame ({'jeden': [0,1, .32, .2, 0.4, 0.8]," dwa ": [. 23, .18, .56, .61,. 12], "trzy": [. 9, .3, .6, .5, .3], "cztery": [. 34, .75, .91, .19, .21], "zive": [ 0,1, 0,32, .2, 0,4, 0,8], "sześć": [. 9, .3, .6, .5, .3], "napęd": [. 9, .3, .6, .5 , .3]}) ' – jezrael

1

niedawno znalazłem nawet czystsze odpowiedź na moje pytanie, można porównać poziomy wielu indeksów według wartości.

Właśnie tego użyłem.

corr = df.corr().stack() 
corr = corr[corr.index.get_level_values(0) != corr.index.get_level_values(1)] 
Powiązane problemy