2016-02-15 20 views
6

Sto cercando di trovare le correlazioni più alte per le diverse colonne con i panda. So può ottenere matrice di correlazione conPanda: come eliminare l'auto-correlazione dalla matrice di correlazione

df.corr() 

so di poter ottenere i massimi correlazioni dopo che con

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

Il problema è che questi correlazione anche contengono valori per la colonna con la colonna stessa (1) . Come rimuovo queste colonne che contengono la correlazione con sé? So che posso rimuoverli rimuovendo tutti i valori 1 ma non voglio farlo perché potrebbero esserci anche 1 correlazioni effettive.

risposta

8

Diciamo che avete

corrs = df.corr() 

Allora il problema è con gli elementi diagonali, IIUC. Si può facilmente impostare a un valore negativo, dicono -2 (che sarà necessariamente inferiore tutte le correlazioni) con

np.fill_diagonal(corrs.values, -2) 

Esempio

(Molte grazie a @Fabian Rost per la miglioramento & @jezrael per la 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

Si potrebbero anche avere valori negativi per le correlazioni. Quindi sarebbe meglio impostarli su un valore inferiore a -1. –

+1

@FabianRost Questo è un punto eccellente. Aggiornerò Grazie! –

+1

Forse puoi aggiungere sample 'df = pd.DataFrame ({'one': [0.1, .32, .2, 0.4, 0.8], 'two': [. 23, .18, .56, .61,. 12], 'tre': [. 9, .3, .6, .5, .3], 'four': [. 34, .75, .91, .19, .21], 'zive': [ 0.1, .32, .2, 0.4, 0.8], 'sei': [. 9, .3, .6, .5, .3], 'drive': [. 9, .3, .6, .5 , .3]}) ' – jezrael

1

di recente ho trovato risposta ancora più pulita alla mia domanda, è possibile confrontare livelli multiindice per valore.

Questo è quello che ho finito di usare.

corr = df.corr().stack() 
corr = corr[corr.index.get_level_values(0) != corr.index.get_level_values(1)] 
Problemi correlati