Ich habe den folgenden Pandas-Datenrahmen Top15
:
Ich erstelle eine Spalte, in der die Anzahl der zitierfähigen Dokumente pro Person geschätzt wird:
Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Ich möchte den Zusammenhang zwischen der Anzahl zitierfähiger Dokumente pro Kopf und der Energieversorgung pro Kopf kennen. Also benutze ich die .corr()
Methode (Pearson-Korrelation):
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Ich möchte eine einzelne Nummer zurückgeben, aber das Ergebnis ist:
python
pandas
correlation
tong zhu
quelle
quelle
.corr
direkt auf Ihren Datenrahmen anwenden, werden alle paarweisen Korrelationen zurückgegeben. Deshalb beobachten Sie dann 1s in der Diagonale Ihrer Matrix (jede Spalte ist perfekt mit sich selbst korreliert). Siehe meine Bearbeitung unten.Antworten:
Ohne tatsächliche Daten ist es schwierig, die Frage zu beantworten, aber ich denke, Sie suchen nach so etwas:
Das berechnet die Korrelation zwischen Ihren beiden Spalten
'Citable docs per Capita'
und'Energy Supply per Capita'
.Um ein Beispiel zu geben:
Dann
gibt
1
wie erwartet.Wenn Sie nun einen Wert ändern, z
der Befehl
kehrt zurück
das ist immer noch nahe an 1, wie erwartet.
Wenn Sie
.corr
direkt auf Ihren Datenrahmen anwenden, werden alle paarweisen Korrelationen zwischen Ihren Spalten zurückgegeben . Deshalb beobachten Sie dann1s
an der Diagonale Ihrer Matrix (jede Spalte ist perfekt mit sich selbst korreliert).werde daher zurückkehren
In der Grafik, die Sie zeigen, wird nur die obere linke Ecke der Korrelationsmatrix dargestellt (nehme ich an).
Es kann Fälle geben, in denen Sie
NaN
s in Ihrer Lösung erhalten - überprüfen Sie diesen Beitrag für ein Beispiel.Wenn Sie Einträge über / unter einem bestimmten Schwellenwert filtern möchten, können Sie diese Frage überprüfen . Wenn Sie eine Heatmap der Korrelationskoeffizienten zeichnen möchten, können Sie diese Antwort überprüfen. Wenn Sie dann auf das Problem mit überlappenden Achsenbeschriftungen stoßen, lesen Sie den folgenden Beitrag .
quelle
df.loc[1, :].corr(df.loc[2, :])
auch gut funktionieren. Für den gesamten Datenrahmen können Sie einfach transponieren :df.T.corr()
.1
in Ihrem Fall statt zurückkehrt0.99586
?Ich bin auf das gleiche Problem gestoßen. Es schien
Citable Documents per Person
ein Float zu sein, und Python überspringt es standardmäßig irgendwie. Alle anderen Spalten meines Datenrahmens hatten Numpy-Formate, daher habe ich das Problem gelöst, indem ich die Spalte in konvertiert habenp.float64
Denken Sie daran, dass es genau die Spalte ist, die Sie selbst berechnet haben
quelle
Meine Lösung wäre nach der Konvertierung von Daten in einen numerischen Typ:
quelle
Wenn Sie die Korrelationen zwischen allen Spaltenpaaren möchten, können Sie Folgendes tun:
quelle
Wenn Sie dies nennen:
Da die Funktion DataFrame.corr () paarweise Korrelationen ausführt, haben Sie vier Paare aus zwei Variablen. Im Grunde genommen erhalten Sie diagonale Werte als Autokorrelation (Korrelation mit sich selbst, zwei Werte, da Sie zwei Variablen haben) und zwei andere Werte als Kreuzkorrelationen zwischen einer und einer anderen und umgekehrt.
Führen Sie entweder eine Korrelation zwischen zwei Reihen durch, um einen einzelnen Wert zu erhalten:
oder, wenn Sie einen einzelnen Wert aus derselben Funktion (DataFrame's corr) möchten:
Hoffe das hilft.
quelle
Es funktioniert so:
quelle
Ich habe dieses Problem durch Ändern des Datentyps gelöst. Wenn Sie sehen, dass die 'Energieversorgung pro Kopf' ein numerischer Typ ist, während die 'Zitierbare Dokumente pro Kopf' ein Objekttyp ist. Ich habe die Spalte mit astype in float konvertiert. Ich hatte das gleiche Problem mit einigen np-Funktionen:
count_nonzero
undsum
arbeitete währendmean
undstd
nicht.quelle
Wenn Sie "Citable Docs per Capita" vor der Korrelation in "numerisch" ändern, wird das Problem behoben.
quelle