¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Unir tablas para analizar datos

Después de esta lección: Puedo unir dos tablas por una columna común y comprobar que la unión hizo lo que quería.

Lección de 60 min7 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Son más tranquilos los festivos?

La tienda de bicicletas tiene una tabla de alquileres y, aparte, una lista de festivos. El dueño pregunta si esos días hay menos movimiento.

Ninguna de las dos tablas responde sola. Los alquileres no tienen columna de festivo, y la lista de festivos no tiene alquileres. Hay que unirlas por la fecha que comparten.

Al final de esta lección

Nota

Puedo unir dos tablas por una columna común y comprobar que la unión hizo lo que quería.

Palabras clave

PalabraQué significaEjemplo
Uniónponer lado a lado las filas de dos tablas donde una columna coincidemerge
Clavela columna que comparten las dos tablas para encontrar las parejasdate
Unión izquierdaconservar todas las filas de la primera tabla, con pareja o sin ella
Unión internaconservar solo las filas que tienen pareja en las dos tablas
Sin parejauna fila que no encuentra nada en la otra tabla
Únicoque aparece una sola vez en una columna

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Dos tablas, una columna común

Los datos suelen guardarse en varias tablas pequeñas para escribir cada hecho una sola vez. La lista de festivos se escribe una vez, no se copia en 365 filas.

Para usar las dos, las unes. Eliges una columna que tengan las dos, la clave. Cada fila de una busca las filas de la otra con el mismo valor de clave.

Crear la segunda tabla

Pulsa Iniciar en la barra de la lección y espera a que el laboratorio esté en marcha. El terminal no tiene Python: cada Run lanza un comando en el laboratorio con docker exec jupyter.

El laboratorio solo trae hires.csv. El primer Run escribe un segundo archivo, holidays.csv, con ocho festivos de 2025.

Escribir la lista de festivos

Comando
docker exec jupyter sh -c "printf '%s\n' 'date,holiday' '2025-01-01,Año Nuevo' '2025-01-06,Reyes' '2025-04-17,Jueves Santo' '2025-04-18,Viernes Santo' '2025-05-01,Fiesta del Trabajo' '2025-08-15,Asunción' '2025-12-08,Inmaculada' '2025-12-25,Navidad' > holidays.csv"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Leerla de nuevo

Comando
docker exec jupyter cat holidays.csv

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

La unión izquierda conserva todas tus filas

Una unión izquierda parte de la primera tabla. Todas sus filas se quedan. Si una fila encuentra pareja, se rellenan las columnas nuevas. Si no, quedan vacías.

Es la opción segura para añadir información a una tabla. Añadir una columna no puede hacerte perder un día.

Ejemplo resuelto: tres días unidos

datehiresholiday
2025-04-16280(vacío)
2025-04-17176Jueves Santo
2025-04-21232(vacío)

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Unir y mostrar los festivos

Comando
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('holidays.csv'); j=h.merge(b, on='date', how='left'); print(len(h), len(b), len(j)); print(j['holiday'].notna().sum()); print(j[j['holiday'].notna()][['date','weekday','holiday','hires']].to_string(index=False))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una unión hecha a mano en Python

Código: python
# Una unión a mano: cada fila de alquileres busca su fecha entre los festivos.
hires = [["2025-04-16", 280], ["2025-04-17", 176], ["2025-04-21", 232]]
holidays = {"2025-04-17": "Jueves Santo"}
for row in hires:
    date = row[0]
    count = row[1]
    name = "ninguno"
    if date in holidays:
        name = holidays[date]
    print(date, count, name)
# Añade "2025-04-21": "Lunes de Pascua" a los festivos y vuelve a ejecutar.

Izquierda, interna y externa

Una unión interna conserva solo las filas que tienen pareja en las dos tablas. Una unión externa conserva todas las filas de las dos tablas, con pareja o sin ella.

La elección cambia el número de filas y, con él, todos los números que calcules después. Di qué unión usaste y por qué.

Contar las filas de cada tipo de unión

Comando
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('holidays.csv'); print(len(h.merge(b, on='date', how='inner')), len(h.merge(b, on='date', how='left')), len(h.merge(b, on='date', how='outer')))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Agrupar y leer el tamaño de cada grupo

Una vez unidas, haz la pregunta. Marca cada día como festivo o no, conserva los días laborables y calcula la media de alquileres de cada grupo.

Mira cuántos días hay en cada grupo. Una media sobre ocho días es una prueba mucho más débil que una sobre 253.

Comparar festivos y días laborables normales

Comando
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('holidays.csv'); j=h.merge(b, on='date', how='left'); j['is_holiday']=j['holiday'].notna(); w=j[j['weekday'].isin(['Mon','Tue','Wed','Thu','Fri'])]; print(w.groupby('is_holiday')['hires'].agg(['count','mean']).round(1))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una clave repetida multiplica las filas

Si la clave se repite en la segunda tabla, una fila de la primera encuentra cada copia y se escribe una vez por cada una. La tabla crece, y todos los totales posteriores salen demasiado grandes.

Pandas puede comprobarlo. Pasa validate="one_to_one" y se detiene con un error si una clave no es única.

Repetir un festivo y unir otra vez

Comando
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('holidays.csv'); b=pd.concat([b, b.iloc[[0]]]); print(len(h.merge(b, on='date', how='left')), b['date'].is_unique)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pedir a pandas que lo rechace

Comando
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('holidays.csv'); b=pd.concat([b, b.iloc[[0]]]); h.merge(b, on='date', how='left', validate='one_to_one')" 2>&1 | tail -n 1

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que una unión izquierda no puede cambiar el número de filas. Puede aumentarlo. Nunca pierde una fila de la primera tabla, pero una clave repetida hace copias de ella. Compara el número de filas antes y después.

Para ir más lejos: el día después

En tu cuaderno, une de nuevo los festivos con hires.csv. Calcula después la media de alquileres el día siguiente a cada festivo.

Pista: suma un día a cada fecha de festivo con pd.to_datetime(...) + pd.Timedelta(days=1) antes de unir. Di primero lo que esperas.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.