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:

IDSexoEdadSíntomas
L01H43Dolor;Falta de visión;Estrés
L02H43Falta de visión;Cojera
L02H43Dolor;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í:

IDSexoEdadSINT_DolorSINT_Falta de visiónSINT_EstrésSINT_Cojera
L01H431110
L02H430101
L02H431011

¿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.

Obtener acceso