2016-05-19 3 views
2

Ich weiß, wie eine (schöne) Pandas Korrelationstabelle, durch Korrelation Platz zu schaffen:Pandas Korrelationstabelle von n Zeilen m Spalten begrenzt

c = df.corr().abs() 
np.set_printoptions(threshold='nan') 
s = c.unstack() 
so = s.order(kind="quicksort") 
pprint(so) 

Das ist großartig.

Das Problem ist, dies gibt die Korrelationen für die vollständige Matrix der Werte - für alle Spalten x alle Spalten, in einer Kreuzmatrix.

Aber was, wenn ich nur eine Spalte, sagen wir df['m'], für seine Korrelationen über alle anderen Spalten überprüfen möchte?

Muss ich zwei Datenrahmen erstellen und die Korrelationen zwischen ihnen überprüfen? Gibt es ein schnelleres Skript?

Antwort

1

IIUC, könnten Sie einfach schneiden die corr()DataFrame wie:

c = df.corr()['m'].abs() 
so = c.sort_values(kind='quicksort') 
print(so) 
2

Sie könnten einfach eine Schleife durch die Spalten von df und bauen eine Serie aus den Korrelationen:

result = (pd.Series([df['m'].corr(df[col]) for col in df], index=df.columns) 
      .abs().sort_values()) 

Wenn Sie planen dies für viele Spalten zu tun, es schneller sein kann, die gesamte Korrelationsmatrix zu berechnen und Verwenden Sie .loc, um die Zeilen von Interesse auszuwählen: so.loc['m'].


Zum Beispiel

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

df = pd.DataFrame(np.random.random((4,4)), columns=list('klmn')) 
result = (pd.Series([df['m'].corr(df[col]) for col in df], index=df.columns) 
      .abs().sort_values()) 
print(result) 
# l 0.041438 
# n 0.086255 
# k 0.393375 
# m 1.000000 
# dtype: float64 

c = df.corr().abs() 
s = c.unstack() 
so = s.sort_values() # s.order is deprecated. use s.sort_values 
print(so.loc['m']) 
# l 0.041438 
# n 0.086255 
# k 0.393375 
# m 1.000000 
# dtype: float64 

Hinweis result und so.loc['m'] sind die gleichen.