Ich habe einen Datenrahmen in Pandas, in dem jede Spalte einen anderen Wertebereich hat. Beispielsweise:
df:
A B C
1000 10 0.5
765 5 0.35
800 7 0.09
Irgendeine Idee, wie ich die Spalten dieses Datenrahmens normalisieren kann, wobei jeder Wert zwischen 0 und 1 liegt?
Meine gewünschte Ausgabe ist:
A B C
1 1 1
0.765 0.5 0.7
0.8 0.7 0.18(which is 0.09/0.5)
ddof
argument?Antworten:
Sie können das Paket sklearn und die zugehörigen Vorverarbeitungsprogramme verwenden, um die Daten zu normalisieren.
Weitere Informationen finden Sie in der Scikit-Learn- Dokumentation zur Vorverarbeitung von Daten: Skalieren von Funktionen auf einen Bereich.
quelle
pd.DataFrame(min_max_scaler.fit_transform(df.T), columns=df.columns, index=df.index)
df=pandas.DataFrame(x_scaled, columns=df.columns)
Ein einfacher Weg mit Pandas : (hier möchte ich die mittlere Normalisierung verwenden)
Min-Max-Normalisierung verwenden:
Bearbeiten: Um einige Bedenken auszuräumen, muss gesagt werden, dass Pandas im obigen Code automatisch die colomn-weise Funktion anwendet.
quelle
Basierend auf diesem Beitrag: /stats/70801/how-to-normalize-data-to-0-1-range
Sie können Folgendes tun:
Sie müssen sich keine Sorgen machen, ob Ihre Werte negativ oder positiv sind. Und die Werte sollten gut zwischen 0 und 1 verteilt sein.
quelle
Ihr Problem ist eigentlich eine einfache Transformation, die auf die Spalten wirkt:
Oder noch knapper:
quelle
lambda
eine ist der beste :-)axis [...] 0 or 'index': apply function to each column
. Die Standardeinstellung ist eigentlich,axis=0
damit dieser Einzeiler noch kürzer geschrieben werden kann :-) Danke @tschm.Wenn Sie das sklearn-Paket verwenden möchten, können Sie die Spalten- und Indexnamen mithilfe von Pandas
loc
wie folgt beibehalten :quelle
Einfach ist schön:
quelle
df["A"] = (df["A"]-df["A"].min()) / (df["A"].max()-df["A"].min())
df /= df.max()
- Unter der Annahme, dass das Ziel darin besteht, jede einzelne Spalte einzeln zu normalisieren.Sie können eine Liste von Spalten erstellen, die Sie normalisieren möchten
Ihr Pandas-Datenrahmen wird jetzt nur in den gewünschten Spalten normalisiert
Allerdings , wenn Sie das wollen gegenüber , wählen Sie eine Liste der Spalten , dass Sie NICHT TUN normalisieren möchten, können Sie einfach eine Liste aller Spalten erstellen , und dass nicht Gewünschten entfernen
quelle
Die Lösung von Sandman und Praveen ist sehr gut. Das einzige Problem dabei ist, dass diese Methode einige Anpassungen erfordert, wenn Sie kategoriale Variablen in anderen Spalten Ihres Datenrahmens haben.
Meine Lösung für diese Art von Problem lautet wie folgt:
quelle
Ich denke, dass ein besserer Weg, dies bei Pandas zu tun, gerecht ist
Bearbeiten Wenn in Ihrem Datenrahmen negative Zahlen vorhanden sind, sollten Sie stattdessen verwenden
quelle
Beispiel für verschiedene Standardisierungen in Python.
Eine Referenz finden Sie in diesem Wikipedia-Artikel: https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation
Beispieldaten
Normalisierung mit Pandas (Gibt unvoreingenommene Schätzungen)
Bei der Normalisierung subtrahieren wir einfach den Mittelwert und dividieren durch die Standardabweichung.
Normalisierung mit sklearn (Gibt voreingenommene Schätzungen, die sich von Pandas unterscheiden)
Wenn Sie dasselbe tun, erhalten
sklearn
Sie eine VERSCHIEDENE Ausgabe!Macht voreingenommene Schätzungen von sklearn maschinelles Lernen weniger leistungsfähig?
NEIN.
Die offizielle Dokumentation von sklearn.preprocessing.scale besagt, dass die Verwendung eines voreingenommenen Schätzers die Leistung von Algorithmen für maschinelles Lernen UNMÖGLICHERWEISE beeinträchtigt und wir sie sicher verwenden können.
Was ist mit MinMax-Skalierung?
Bei der MinMax-Skalierung gibt es keine Standardabweichungsberechnung. Das Ergebnis ist also sowohl bei Pandas als auch bei Scikit-Learn gleich.
quelle
Möglicherweise möchten Sie, dass einige Spalten normalisiert werden und die anderen unverändert bleiben, wie bei einigen Regressionsaufgaben, bei denen Datenbeschriftungen oder kategoriale Spalten unverändert bleiben. Ich empfehle Ihnen daher diese pythonische Methode (eine Kombination aus @ shg- und @ Cina-Antworten):
quelle
Es ist nur einfache Mathematik. Die Antwort sollte so einfach wie unten sein.
quelle
Aus dem Dokument von Pandas kann die DataFrame-Struktur eine Operation (Funktion) auf sich selbst anwenden.
Sie können eine benutzerdefinierte Funktion anwenden, um den DataFrame zu bedienen.
quelle
Die folgende Funktion berechnet den Z-Score:
quelle
So machen Sie es spaltenweise mit Listenverständnis:
quelle
Sie können die Funktion pandas.DataFrame.transform 1 einfach folgendermaßen verwenden :
quelle
quelle
Sie können dies in einer Zeile tun
Es nimmt den Mittelwert für jede Spalte und subtrahiert ihn dann (Mittelwert) von jeder Zeile (der Mittelwert einer bestimmten Spalte subtrahiert nur von ihrer Zeile) und dividiert nur durch den Mittelwert. Schließlich erhalten wir den normalisierten Datensatz.
quelle
Pandas führt standardmäßig eine spaltenweise Normalisierung durch. Versuchen Sie den folgenden Code.
Die Ausgabewerte liegen im Bereich von 0 und 1.
quelle