¿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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Unión | poner lado a lado las filas de dos tablas donde una columna coincide | merge |
| Clave | la columna que comparten las dos tablas para encontrar las parejas | date |
| Unión izquierda | conservar todas las filas de la primera tabla, con pareja o sin ella | |
| Unión interna | conservar solo las filas que tienen pareja en las dos tablas | |
| Sin pareja | una fila que no encuentra nada en la otra tabla | |
| Único | que 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
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
docker exec jupyter cat holidays.csvSe 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
| date | hires | holiday |
|---|---|---|
| 2025-04-16 | 280 | (vacío) |
| 2025-04-17 | 176 | Jueves Santo |
| 2025-04-21 | 232 | (vacío) |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Unir y mostrar los festivos
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
# 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
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
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
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
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 1Se 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.