Dummificar múltiples columnas en Pandas con Python
Otra de las pesadillas recurrentes que tengo de tanto preprocesar datos :)
Muchas veces podemos recibir una base de datos con una estructura como esta:
ID | Sexo | Edad | Síntomas |
---|---|---|---|
L01 | H | 43 | Dolor;Falta de visión;Estrés |
L02 | H | 43 | Falta de visión;Cojera |
L02 | H | 43 | Dolor;Estrés;Cojera |
Como podréis observar, la columna Síntomas tiene varios valores por cada registro, lo que hace muy difícil su análisis sin realizar ningún preprocesado previo.
La función get_dummies de pandas
Por suerte para nosotros, pandas viene integrado con una función get_dummies para sus Series.
Básicamente lo que hará la función es crear una columna por cada valor diferente de cada celda, separándolos por el caracter que nosotros especifiquemos, y rellenar dicha columna con ceros y unos. 0 si no está el valor presente en una celda y 1 si está presente.
Tras dummificar, la tabla superior quedaría así:
ID | Sexo | Edad | SINT_Dolor | SINT_Falta de visión | SINT_Estrés | SINT_Cojera |
---|---|---|---|---|---|---|
L01 | H | 43 | 1 | 1 | 1 | 0 |
L02 | H | 43 | 0 | 1 | 0 | 1 |
L02 | H | 43 | 1 | 0 | 1 | 1 |
¿Cómo generamos columnas dummies a partir de varias columnas?
Como podrás ver en su documentación, la función get_dummies
devuelve un nuevo DataFrame que tendremos que unir al original. Esto podemos hacerlo de la siguiente manera:
import pandas as pd
# Leemos la base de datos
df = pd.read_csv('./my-db.csv', sep=';')
# Definimos qué columnas serán dummificadas y cómo deben ser interpretadas
# Cada clave del diccionario equivale a un nombre de columna
# `prefix` es el prefijo que se añadirá a cada columna dummy
# `sep` especifica el caracter separador de los elementos de la celda
dummy_columns = {
'Síntomas': {
'prefix': 'SINT',
'sep': ';'
}
# Aquí podemos añadir todas las columnas que queramos
}
for column_name, dummy_data in dummy_columns.items():
# Recogemos un DataFrame con una columna dummy por cada valor
dummies = df[column_name].str.get_dummies(sep=dummy_data['sep'])
# Añadimos `prefix` a cada columna
dummies.columns = map(lambda col: f'{dummy_data["prefix"]}_{col}', dummies.columns)
# Añadimos las columnas dummy al df original
df = pd.concat([df, dummies], axis=1)
# [Opcional] Eliminamos las columnas originales de df
df = df.drop(columns=dummy_columns.keys())
# Ahora df.head() mostrará las columnas dummy
df.head()
¿Quieres aprender más sobre preprocesar datos en Pandas?
Estoy escribiendo un libro sobre este tema. Su precio será de 30.00€, pero puedes obtener acceso instantáneo a cada capítulo que voy escribiendo pagando ahora 14.99€ (50% de descuento) para ayudarme mientras lo escribo.