2016-02-15 5 views
6

Ich versuche, die höchsten Korrelationen für verschiedene Spalten mit Pandas zu finden. Ich weiß, kann Korrelationsmatrix mitPandas: Wie man die Eigenkorrelation von der Korrelationsmatrix löscht

df.corr() 

bekomme ich weiß, ich kann die höchsten Korrelationen danach erhalten mit

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

Das Problem ist, dass diese Korrelation enthält auch Werte für die Spalte mit der Säule (1) selbst . Wie entferne ich diese Spalten, die Korrelation mit Selbst enthalten? Ich weiß, dass ich sie entfernen kann, indem ich alle 1 Werte entferne, aber ich möchte das nicht tun, da es auch 1 Korrelationen geben könnte.

Antwort

8

Sagen Sie bitte

corrs = df.corr() 

Dann wird das Problem mit den Diagonalelemente ist, IIUC. Sie können sie leicht zu einem gewissen negativen Wert gesetzt, sagt -2 (was notwendigerweise geringer sein wird als alle Korrelationen) mit

np.fill_diagonal(corrs.values, -2) 

Beispiel

(Vielen Dank an @Fabian Rost für die Verbesserung & @jezrael für den Datenrahmen)

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

Sie könnten auch negative Werte für Korrelationen haben. Daher wäre es besser, sie auf einen Wert kleiner als -1 zu setzen. –

+1

@ FabianRost Das ist ein ausgezeichneter Punkt. Ich werde aktualisieren. Vielen Dank! –

+1

Vielleicht können Sie Beispiel hinzufügen 'df = pd.DataFrame ({'eins': [0.1, .32, .2, 0.4, 0.8], 'zwei': [. 23, .18, .56, .61,. 12], 'drei': [. 9, .3, .6, .5, .3], 'vier': [. 34, .75, .91, .19, .21], 'zive': [ 0.1, .32, .2, 0.4, 0.8], 'sechs': [. 9, .3, .6, .5, .3], 'Antrieb': [. 9, .3, .6, .5 .3]}) ' – jezrael

1

ich vor kurzem noch saubere Antwort auf meine Frage gefunden haben, können Sie vergleichen Multi-Index-Ebenen nach Wert.

Das habe ich beendet.

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