Tengo un marco de datos en pandas donde cada columna tiene un rango de valores diferente. Por ejemplo:
df:
A B C
1000 10 0.5
765 5 0.35
800 7 0.09
¿Alguna idea de cómo puedo normalizar las columnas de este marco de datos donde cada valor está entre 0 y 1?
Mi salida deseada es:
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
argumento?Respuestas:
Puede usar el paquete sklearn y sus utilidades de preprocesamiento asociadas para normalizar los datos.
Para obtener más información vistazo a la scikit-learn documentación de pre-procesamiento de datos: escala cuenta con una gama.
fuente
pd.DataFrame(min_max_scaler.fit_transform(df.T), columns=df.columns, index=df.index)
df=pandas.DataFrame(x_scaled, columns=df.columns)
Una manera fácil mediante el uso de Pandas : (aquí quiero usar la normalización media)
para usar la normalización min-max:
Editar: para abordar algunas inquietudes, es necesario decir que Pandas aplica automáticamente la función de columnas en el código anterior.
fuente
Basado en esta publicación: /stats/70801/how-to-normalize-data-to-0-1-range
Puedes hacer lo siguiente:
No necesita preocuparse si sus valores son negativos o positivos. Y los valores deben estar bien distribuidos entre 0 y 1.
fuente
Su problema es en realidad una simple transformación que actúa sobre las columnas:
O incluso más conciso:
fuente
lambda
mejor :-)axis [...] 0 or 'index': apply function to each column
. El valor predeterminado es en realidad,axis=0
por lo que esta línea única se puede escribir aún más corta :-) Gracias @tschm.Si le gusta usar el paquete sklearn, puede mantener la columna y los nombres de índice usando pandas
loc
así:fuente
Lo simple es hermoso:
fuente
df["A"] = (df["A"]-df["A"].min()) / (df["A"].max()-df["A"].min())
df /= df.max()
- suponiendo que el objetivo es normalizar todas y cada una de las columnas, individualmente.Puede crear una lista de columnas que desea normalizar.
Su marco de datos de Pandas ahora está normalizado solo en las columnas que desea
Sin embargo , si desea lo contrario , seleccione una lista de columnas que NO desea normalizar, simplemente puede crear una lista de todas las columnas y eliminar las que no desee.
fuente
Creo que una mejor manera de hacerlo en pandas es simplemente
Editar Si en su marco de datos hay números negativos, debe usarlos en su lugar
fuente
La solución dada por Sandman y Praveen está muy bien. El único problema con eso es que si tiene variables categóricas en otras columnas de su marco de datos, este método necesitará algunos ajustes.
Mi solución a este tipo de problema es la siguiente:
fuente
Ejemplo de diferentes estandarizaciones en python.
Para una referencia, mire este artículo de Wikipedia: https://en.wikipedia.org/wiki/Unlimited_estimation_of_standard_deviation
Datos de ejemplo
Normalización usando pandas (Da estimaciones imparciales)
Al normalizar, simplemente restamos la media y la dividimos por desviación estándar.
Normalización usando sklearn (Da estimaciones sesgadas, diferentes de los pandas)
Si hace lo mismo con
sklearn
usted, ¡obtendrá DIFERENTES resultados!¿Las estimaciones sesgadas de sklearn hacen que el aprendizaje automático sea menos potente?
NO.
La documentación oficial de sklearn.preprocessing.scale establece que el uso del estimador sesgado NO PROBABLEMENTE afecta el rendimiento de los algoritmos de aprendizaje automático y podemos usarlos de manera segura.
¿Qué pasa con la escala MinMax?
No hay cálculo de desviación estándar en la escala MinMax. Por lo tanto, el resultado es el mismo tanto en pandas como en scikit-learn.
fuente
Es posible que desee que algunas columnas se normalicen y las otras no cambien, como algunas de las tareas de regresión cuyas etiquetas de datos o columnas categóricas no cambian, así que le sugiero esta forma pitónica (es una combinación de respuestas @shg y @Cina):
fuente
Es solo matemática simple. La respuesta debería ser tan simple como a continuación.
fuente
Desde el documento de pandas, la estructura DataFrame puede aplicar una operación (función) a sí misma.
Puede aplicar una función personalizada para operar el DataFrame.
fuente
La siguiente función calcula la puntuación Z:
fuente
Así es como lo hace en columnas usando la comprensión de la lista:
fuente
Simplemente puede usar la función pandas.DataFrame.transform 1 de esta manera:
fuente
fuente
Puedes hacer esto en una línea
toma la media para cada una de las columnas y luego la resta (media) de cada fila (la media de una columna en particular resta solo de su fila) y divide solo por la media. Finalmente, lo que obtenemos es el conjunto de datos normalizado.
fuente
Pandas realiza la normalización de columnas en forma predeterminada. Prueba el siguiente código.
Los valores de salida estarán en el rango de 0 y 1.
fuente