2017-01-23 6 views
1

Ich habe eine Reihe von Werten und ich bin auf der Suche nach der Pearson Korrelation mit jeder Zeile einer gegebenen Tabelle.Korrelation zwischen einer Pandas-Serie und einem ganzen Dataframe

Wie mache ich das?

Beispiel:

import pandas as pd 

v = [-1, 5, 0, 0, 10, 0, -7] 
v1 = [1, 0, 0, 0, 0, 0, 0] 
v2 = [0, 1, 0, 0, 1, 0, 0] 
v3 = [1, 1, 0, 0, 0, 0, 1] 

s = pd.Series(v) 
df = pd.DataFrame([v1, v2, v3], columns=['a', 'b', 'c', 'd', 'e', 'f', 'g']) 

# Here I expect ot do df.corrwith(s) - but won't work 

Series.corr() Verwendung zu berechnen, die erwartete Ausgabe ist

-0.1666666666666666 # correlation with the first row 
0.83914639167827343 # correlation with the second row 
-0.35355339059327379 # correlation with the third row 

Antwort

1

Sie müssen gleiche index von Series als columns von DataFrame für align Series von DataFrame und fügen axis=1 in corrwith für zeilenweise Korrelation:

s1 = pd.Series(s.values, index=df.columns) 
print (s1) 
a -1 
b  5 
c  0 
d  0 
e 10 
f  0 
g -7 
dtype: int64 

print (df.corrwith(s1, axis=1)) 
0 -0.166667 
1 0.839146 
2 -0.353553 
dtype: float64 

print (df.corrwith(pd.Series(v, index=df.columns), axis=1)) 
0 -0.166667 
1 0.839146 
2 -0.353553 
dtype: float64 

EDIT:

Sie Spalten und Verwendung Teilmenge angeben:

cols = ['a','b','e'] 

print (df[cols]) 
    a b e 
0 1 0 0 
1 0 1 1 
2 1 1 0 

print (df[cols].corrwith(pd.Series(v, index=df.columns), axis=1)) 
0 -0.891042 
1 0.891042 
2 -0.838628 
dtype: float64 
+0

Danke, was ein Anfängerfehler ... genau das, was ich brauchte – bluesummers

+0

Kein Problem, wie Würden Sie das machen, wenn der Datenblock mehr Spalten hätte, die Sie ignorieren sollten? Das bedeutet, dass Sie die Korrelation nur mit den übereinstimmenden Spalten für die Indexierung berechnen möchten, während Sie die anderen ignorieren. – bluesummers

+0

Überprüfen Sie die Bearbeitung, wenn Sie möchten, was Sie möchten. – jezrael

Verwandte Themen