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.
quelle
DataFrameMapper
in aDataFrame
.. haben, also ist die Ausgabe nicht bereits eineDataFrame
?import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.read_csv('your file here') ss = StandardScaler() df_scaled = pd.DataFrame(ss.fit_transform(df),columns = df.columns)
Der df_scaled ist der 'gleiche' Datenrahmen, nur jetzt mit den skalierten Werten
quelle
features = ["col1", "col2", "col3", "col4"] autoscaler = StandardScaler() df[features] = autoscaler.fit_transform(df[features])
quelle
Mit scaxit-learn können Sie mit Neuraxle mehrere Datentypen mischen :
Option 1: Verwerfen Sie die Zeilennamen und Spaltennamen
from neuraxle.pipeline import Pipeline from neuraxle.base import NonFittableMixin, BaseStep class PandasToNumpy(NonFittableMixin, BaseStep): def transform(self, data_inputs, expected_outputs): return data_inputs.values pipeline = Pipeline([ PandasToNumpy(), StandardScaler(), ])
Dann gehen Sie wie beabsichtigt vor:
features = df[["col1", "col2", "col3", "col4"]] # ... your df data pipeline, scaled_features = pipeline.fit_transform(features)
Option 2: Behalten Sie die ursprünglichen Spalten- und Zeilennamen bei
Sie können dies sogar mit einem Wrapper als solchem tun:
from neuraxle.pipeline import Pipeline from neuraxle.base import MetaStepMixin, BaseStep class PandasValuesChangerOf(MetaStepMixin, BaseStep): def transform(self, data_inputs, expected_outputs): new_data_inputs = self.wrapped.transform(data_inputs.values) new_data_inputs = self._merge(data_inputs, new_data_inputs) return new_data_inputs def fit_transform(self, data_inputs, expected_outputs): self.wrapped, new_data_inputs = self.wrapped.fit_transform(data_inputs.values) new_data_inputs = self._merge(data_inputs, new_data_inputs) return self, new_data_inputs def _merge(self, data_inputs, new_data_inputs): new_data_inputs = pd.DataFrame( new_data_inputs, index=data_inputs.index, columns=data_inputs.columns ) return new_data_inputs df_scaler = PandasValuesChangerOf(StandardScaler())
Dann gehen Sie wie beabsichtigt vor:
features = df[["col1", "col2", "col3", "col4"]] # ... your df data df_scaler, scaled_features = df_scaler.fit_transform(features)
quelle
Sie können diesen Code ausprobieren. Dadurch erhalten Sie einen DataFrame mit Indizes
import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_boston # boston housing dataset dt= load_boston().data col= load_boston().feature_names # Make a dataframe df = pd.DataFrame(data=dt, columns=col) # define a method to scale data, looping thru the columns, and passing a scaler def scale_data(data, columns, scaler): for col in columns: data[col] = scaler.fit_transform(data[col].values.reshape(-1, 1)) return data # specify a scaler, and call the method on boston data scaler = StandardScaler() df_scaled = scale_data(df, col, scaler) # view first 10 rows of the scaled dataframe df_scaled[0:10]
quelle
from dask_ml.preprocessing import StandardScaler; StandardScaler().fit_transform(df)