Ich möchte die Skalierung (mit StandardScaler () von sklearn.preprocessing) auf einen Pandas-Datenrahmen anwenden. Der folgende Code gibt ein Numpy-Array zurück, sodass ich alle Spaltennamen und Unabhängigkeiten verliere. Das will ich nicht.
features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features = autoscaler.fit_transform(features)
Eine "Lösung", die ich online gefunden habe, ist:
features = features.apply(lambda x: autoscaler.fit_transform(x))
Es scheint zu funktionieren, führt aber zu einer Abwertungswarnung:
/usr/lib/python3.5/site-packages/sklearn/preprocessing/data.py:583: DeprecationWarning: Das Übergeben von 1d-Arrays als Daten ist in 0.17 veraltet und erhöht ValueError in 0.19. Ändern Sie Ihre Daten entweder mit X.reshape (-1, 1), wenn Ihre Daten über ein einzelnes Feature verfügen, oder mit X.reshape (1, -1), wenn sie ein einzelnes Beispiel enthalten.
Ich habe deshalb versucht:
features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1)))
Aber das gibt:
Traceback (letzter Aufruf zuletzt): Datei "./analyse.py", Zeile 91, in features = features.apply (Lambda x: autoscaler.fit_transform (x.reshape (-1, 1))) Datei "/ usr / lib / python3.5 / site-packages / pandas / core / frame.py ", Zeile 3972, in apply return self._apply_standard (f, Achse, reduzieren = reduzieren) Datei" /usr/lib/python3.5/site- packages / pandas / core / frame.py ", Zeile 4081, in _apply_standard result = self._constructor (data = results, index = index) Datei" /usr/lib/python3.5/site-packages/pandas/core/frame .py ", Zeile 226, in init mgr = self._init_dict (Daten, Index, Spalten, dtype = dtype) Datei "/usr/lib/python3.5/site-packages/pandas/core/frame.py", Zeile 363, in _init_dict dtype = dtype) Datei "/usr/lib/python3.5/site-packages/pandas/core/frame.py", Zeile 5163, in der Datei _arrays_to_mgr arrays = _homogenize (Arrays, Index, dtype) "/usr/lib/python3.5/site -packages / pandas / core / frame.py ", Zeile 5477, in _homogenize raise_cast_failure = False) Datei" /usr/lib/python3.5/site-packages/pandas/core/series.py ", Zeile 2885, in _sanitize_array Ausnahme auslösen ('Daten müssen eindimensional sein') Ausnahme: Daten müssen eindimensional sein
Wie wende ich eine Skalierung auf den Pandas-Datenrahmen an, wobei der Datenrahmen intakt bleibt? Wenn möglich, ohne die Daten zu kopieren.