HOWTO · Pandas
Drei Möglichkeiten, numerische DataFrame-Spalten in Pandas zu normalisieren
Vergleiche die Standardisierung mit dem Mittelwert (z-Score), die Min-Max-Skalierung und die Quantilnormalisierung für numerische Pandas-DataFrame-Spalten, mit Formeln und wiederverwendbaren Beispielen.
Auf dieser Seite
Um numerische Spalten in einem Pandas DataFrame neu zu skalieren, stehen drei Verfahren zur Auswahl: Die Mittelwertnormalisierung (z-Score-Standardisierung) zentriert jede Spalte und skaliert sie anhand ihrer Standardabweichung, die Min-Max-Skalierung bildet jede nicht konstante Spalte auf den Bereich 0–1 ab und die Quantilnormalisierung ordnet Werte anhand ihres Rangs einer gemeinsamen Verteilung zu. Welche Methode passt, hängt von der benötigten Skalierung, der Empfindlichkeit gegenüber Ausreißern und der Frage ab, ob die Spalten vergleichbare Verteilungen haben sollen.
Datennormalisierung in Pandas
Bei der Normalisierung werden Werte neu skaliert. Die Standardisierung zentriert Werte dagegen um einen Mittelwert und drückt sie in Einheiten der Standardabweichung aus. Dieser Leitfaden zeigt drei Transformationen, die jeweils spaltenweise angewendet werden. Pandas bietet für diese Formeln keine einzelne spezielle DataFrame-Methode, doch mit den Rechen- und Rangfunktionen lassen sie sich unkompliziert umsetzen.
Die Beispiele verwenden denselben kleinen, deterministischen DataFrame mit vier numerischen Spalten. Jede Transformation wird entlang der Spalten berechnet; Spaltennamen und Zeilenindizes bleiben daher erhalten.
import pandas as pd
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
print(df)
A B C D
0 1 10 4 5
1 2 20 1 5
2 3 30 3 5
3 4 40 2 5
Die Spalte D ist konstant, damit ihr Verhalten im Abschnitt zur Min-Max-Skalierung deutlich wird. Die folgenden Beispiele sind eigenständig und erstellen dieselbe Eingabe erneut.
Pandas DataFrame mit der mean-Normalisierung standardisieren
Die mittelwertbasierte Formel lautet (x - mean) / standard deviation und wird für jede Spalte separat berechnet. Dabei handelt es sich um eine z-Score-Standardisierung: Der Mittelwert jeder transformierten Spalte liegt nahe null, und die Werte werden in Einheiten der Standardabweichung angegeben, statt auf den Bereich 0–1 beschränkt zu sein. Pandas Series.std() verwendet standardmäßig die Stichproben-Standardabweichung (ddof=1); wenn die Populations-Standardabweichung benötigt wird, verwenden Sie ddof=0.
import pandas as pd
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
mean_norm = df.apply(lambda column: (column - column.mean()) / column.std(), axis=0)
print(mean_norm.round(3))
A B C D
0 -1.162 -1.162 1.162 NaN
1 -0.387 -0.387 -1.162 NaN
2 0.387 0.387 0.387 NaN
3 1.162 1.162 -0.387 NaN
Diese Transformation ist sinnvoll, wenn ein Verfahren zentrierte, vergleichbare Skalen benötigt. Bei einer konstanten Spalte ist die Standardabweichung null, daher liefert die Formel für diese Spalte fehlende Werte. Entscheiden Sie je nach Anwendungsfall, ob Sie ein solches Merkmal entfernen oder gesondert behandeln.
Pandas DataFrame mit der min-max-Normalisierung skalieren
Für jede Spalte verwendet die Min-Max-Skalierung die Formel (x - min) / (max - min). Das Minimum und Maximum jeder nicht konstanten Spalte werden dadurch zu 0 und 1; die übrigen Werte liegen proportional dazwischen. Die folgende Hilfsfunktion verwendet ihr Argument df_input durchgehend und bildet eine konstante Spalte auf 0 ab – eine häufig gewählte neutrale Lösung, wenn ein Merkmal keine Variation aufweist.
import pandas as pd
def minmax_norm(df_input):
column_range = df_input.max() - df_input.min()
scaled = (df_input - df_input.min()) / column_range
return scaled.fillna(0)
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
print(minmax_norm(df).round(3))
A B C D
0 0.000 0.000 1.000 0.0
1 0.333 0.333 0.000 0.0
2 0.667 0.667 0.667 0.0
3 1.000 1.000 0.333 0.0
Die Min-Max-Skalierung eignet sich, wenn ein festgelegter Wertebereich wichtig ist. Da das beobachtete Minimum und Maximum die Skala bestimmen, kann ein Extremwert die übrigen Werte einer Spalte auf einen engen Bereich zusammendrücken. Das abschließende fillna(0) der Hilfsfunktion bildet konstante numerische Spalten auf 0 ab, ersetzt aber auch alle fehlenden Werte, die bereits in der Eingabe vorhanden sind, durch 0. Wenn Sie fehlende Werte lieber durch den Mittelwert ersetzen möchten, füllen Sie sie vor dem Aufruf der Funktion auf, zum Beispiel mit minmax_norm(df_input.fillna(df_input.mean())). Wählen Sie eine Imputationsstrategie, die zu Ihren Daten passt.
Pandas DataFrame mit der quantile-Normalisierung transformieren
Die Quantilnormalisierung eignet sich, wenn für die Spalten dieselbe zugrunde liegende Verteilung angenommen werden kann. Dazu wird jede Spalte sortiert, anschließend werden die sortierten Werte an jeder Rangposition über die Spalten hinweg gemittelt und diese Rangmittelwerte den ursprünglichen Zeilen wieder zugeordnet. Anders als die beiden anderen Verfahren verändert diese Methode die Werte, um die empirischen Verteilungen der Spalten aneinander anzugleichen. Verwenden Sie sie daher nur, wenn die Annahme einer gemeinsamen Verteilung angemessen ist.
Diese Implementierung verwendet rank(method="min"): Bei gleichen Werten erhalten alle den kleinsten Rang ihrer Gruppe. Die Ränge werden nicht gemittelt, weshalb Gleichstände dazu führen können, dass die resultierenden Verteilungen voneinander abweichen. Im gemeinsamen Beispiel ist Spalte D konstant: Alle vier Werte haben denselben kleinsten Rang und werden daher demselben Rangmittelwert zugeordnet, statt sich über die gemeinsamen Rangwerte zu verteilen.
import numpy as np
import pandas as pd
def quantile_norm(df_input):
sorted_values = np.sort(df_input.to_numpy(), axis=0)
rank_means = sorted_values.mean(axis=1)
rank_to_mean = pd.Series(rank_means, index=np.arange(1, len(rank_means) + 1))
ranks = df_input.rank(method="min").stack().astype(int)
return ranks.map(rank_to_mean).unstack()
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
print(quantile_norm(df).round(3))
A B C D
0 4.25 4.25 13.25 4.25
1 7.25 7.25 4.25 4.25
2 10.25 10.25 10.25 4.25
3 13.25 13.25 7.25 4.25
Die konstante Spalte D zeigt, warum die Annahme einer gemeinsamen Verteilung wichtig ist: Ihre wiederholten Werte erhalten alle den kleinsten Rang und werden auf 4.25 abgebildet. Damit entspricht ihre empirische Verteilung nicht derjenigen der anderen Spalten. Bei gewöhnlichen numerischen Merkmalen können Sie die Verfahren nach ihrem Ziel auswählen: z-Scores eignen sich zum Zentrieren und Skalieren anhand der Standardabweichung, Min-Max für einen begrenzten Wertebereich unter Berücksichtigung möglicher Ausreißer und Quantilnormalisierung, wenn die Daten das Angleichen der Spaltenverteilungen rechtfertigen.