python - labelencoder - onehotencoder sklearn
¿Cómo usar sklearn fit_transform con pandas y devolver el marco de datos en lugar de una matriz numpy? (1)
Puede convertir el DataFrame como una matriz as_matrix()
usando as_matrix()
. Ejemplo en un conjunto de datos al azar:
Edición: cambiar as_matrix()
a values
, (no cambia el resultado) según la última oración de los documentos as_matrix()
anteriores:
En general, se recomienda utilizar ''.values''.
import pandas as pd
import numpy as np #for the random integer example
df = pd.DataFrame(np.random.randint(0.0,100.0,size=(10,4)),
index=range(10,20),
columns=[''col1'',''col2'',''col3'',''col4''],
dtype=''float64'')
Tenga en cuenta, los índices son 10-19:
In [14]: df.head(3)
Out[14]:
col1 col2 col3 col4
10 3 38 86 65
11 98 3 66 68
12 88 46 35 68
Ahora fit_transform
el DataFrame para obtener la array
scaled_features
:
from sklearn.preprocessing import StandardScaler
scaled_features = StandardScaler().fit_transform(df.values)
In [15]: scaled_features[:3,:] #lost the indices
Out[15]:
array([[-1.89007341, 0.05636005, 1.74514417, 0.46669562],
[ 1.26558518, -1.35264122, 0.82178747, 0.59282958],
[ 0.93341059, 0.37841748, -0.60941542, 0.59282958]])
Asigne los datos escalados a un DataFrame (Nota: use los argumentos de las palabras clave del index
y las columns
para mantener sus índices y nombres de columnas originales:
scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)
In [17]: scaled_features_df.head(3)
Out[17]:
col1 col2 col3 col4
10 -1.890073 0.056360 1.745144 0.466696
11 1.265585 -1.352641 0.821787 0.592830
12 0.933411 0.378417 -0.609415 0.592830
Edición 2:
sklearn-pandas paquete sklearn-pandas . Está enfocado en hacer que el aprendizaje de scikit sea más fácil de usar con pandas. sklearn-pandas
es especialmente útil cuando necesita aplicar más de un tipo de transformación a los subconjuntos de columnas de DataFrame
, un escenario más común. Está documentado, pero así es como lograrías la transformación que acabamos de realizar.
from sklearn_pandas import DataFrameMapper
mapper = DataFrameMapper([(df.columns, StandardScaler())])
scaled_features = mapper.fit_transform(df.copy(), 4)
scaled_features_df = pd.DataFrame(scaled_features, index=df.index, columns=df.columns)
Quiero aplicar la escala (usando StandardScaler () de sklearn.preprocessing) a un marco de datos de pandas. El siguiente código devuelve una matriz numpy, por lo que pierdo todos los nombres e índices de columna. Esto no es lo que quiero.
features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features = autoscaler.fit_transform(features)
Una "solución" que encontré en línea es:
features = features.apply(lambda x: autoscaler.fit_transform(x))
Parece que funciona, pero conduce a una advertencia de desaprobación:
/usr/lib/python3.5/site-packages/sklearn/preprocessing/data.py:583: DeprecationWarning: Pasar matrices 1d como datos está obsoleto en 0.17 y elevará ValueError en 0.19. Cambie la forma de sus datos utilizando X.reshape (-1, 1) si sus datos tienen una sola función o X.reshape (1, -1) si contiene una sola muestra.
Por lo tanto intenté:
features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1)))
Pero esto da:
Seguimiento (última llamada más reciente): Archivo "./analyse.py", línea 91, en features = features.apply (lambda x: autoscaler.fit_transform (x.reshape (-1, 1))) Archivo "/ usr / lib / python3.5 / site-packages / pandas / core / frame.py ", línea 3972, in apply return self._apply_standard (f, axis, reduce = reduce) Archivo" /usr/lib/python3.5/site- packages / pandas / core / frame.py ", línea 4081, en _apply_standard result = self._constructor (data = results, index = index) Archivo" /usr/lib/python3.5/site-packages/pandas/core/frame .py ", línea 226, en init mgr = self._init_dict (datos, índice, columnas, dtype = dtype) Archivo" /usr/lib/python3.5/site-packages/pandas/core/frame.py ", línea 363, en _init_dict dtype = dtype) Archivo "/usr/lib/python3.5/site-packages/pandas/core/frame.py", línea 5163, en _arrays_to_mgr arrays = _homogenize (arrays, index, dtype) File "/ usr / lib / python3.5 / site-packages / pandas / core / frame.py ", línea 5477, en _homogenize raise_cast_failure = False) Archivo" /usr/lib/python3.5/site-packages/pandas/core/series .py ", línea 2885, en _sanitize_a rray raise Exception (''Los datos deben ser unidimensionales'') Exception: Los datos deben ser unidimensionales
¿Cómo aplico el escalado en el marco de datos de pandas, dejando el marco de datos intacto? Sin copiar los datos si es posible.