pandas concat: unir DataFrames por filas o columnas

Dos DataFrames concatenados vertical y horizontalmente con pandas

La función pandas concat une Series o DataFrames por filas o por columnas. Es adecuada para apilar archivos mensuales, combinar particiones con el mismo esquema o colocar variables alineadas por índice. No sustituye a merge cuando la relación depende de claves de negocio.

Concatenar DataFrames por filas

El eje predeterminado es axis=0:

import pandas as pd

enero = pd.DataFrame({"id": [1, 2], "ventas": [120, 90]})
febrero = pd.DataFrame({"id": [3, 4], "ventas": [150, 110]})

acumulado = pd.concat([enero, febrero], ignore_index=True)

ignore_index crea un índice nuevo de 0 a n-1. Si el índice original identifica registros, consérvalo y valida que no existan colisiones.

Qué ocurre cuando las columnas no coinciden

Por defecto, concat realiza una unión externa de las columnas: conserva todas y rellena con valores ausentes donde falten:

pd.concat([enero, febrero_ampliado], join="outer")

Con join="inner" mantiene solo las columnas comunes. Esta opción puede eliminar datos sin que sea evidente, por lo que conviene validar el esquema antes y después.

Una estrategia profesional define las columnas esperadas, corrige nombres y tipos, y registra cualquier columna inesperada. Apilar fuentes incompatibles sin control suele producir tablas difíciles de auditar.

Concatenar por columnas

axis=1 coloca objetos uno junto al otro y los alinea por índice:

clientes = pd.DataFrame({"nombre": ["Ana", "Luis"]}, index=[10, 20])
metricas = pd.DataFrame({"compras": [4, 7]}, index=[10, 20])

resultado = pd.concat([clientes, metricas], axis=1)

Si los índices no coinciden, aparecen filas y valores ausentes. No uses reset_index de forma automática para “hacer que encaje”: podrías asociar métricas con el cliente equivocado. Valida la clave o utiliza merge.

concat frente a merge y join

concat organiza objetos completos a lo largo de un eje. merge implementa relaciones similares a los JOIN de SQL mediante una o varias claves. DataFrame.join facilita uniones por índice.

Pregunta qué define la correspondencia. Si dos tablas se relacionan por customer_id, merge es la opción natural. Si representan lotes con las mismas columnas, concat suele ser correcta.

Conservar el origen con keys

keys crea un nivel adicional en el índice e identifica de dónde procede cada bloque:

historico = pd.concat(
    [enero, febrero],
    keys=["2026-01", "2026-02"],
    names=["periodo", "fila"],
)

Esta trazabilidad es útil para auditorías, análisis por período y diagnóstico de errores. También puedes añadir una columna de origen antes de concatenar si prefieres un índice simple.

Detectar índices duplicados

verify_integrity=True hace que concat genere un error si el nuevo eje contiene etiquetas duplicadas. Puede ser más costoso, pero ayuda cuando la unicidad es una condición necesaria.

Después de unir, verifica filas, columnas, tipos y nulos. Un recuento de entrada y salida debería cuadrar en una concatenación vertical salvo que hayas aplicado filtros.

Rendimiento: no concatenes dentro de cada iteración

Crear un DataFrame nuevo en cada vuelta copia datos repetidamente:

partes = []
for archivo in archivos:
    partes.append(pd.read_parquet(archivo))

resultado = pd.concat(partes, ignore_index=True)

Acumular los objetos en una lista y concatenar una vez suele ser mucho más eficiente. Para volúmenes que no caben en memoria, procesa por lotes o utiliza una herramienta distribuida y formatos columnares.

Tipos de datos

Columnas con tipos distintos pueden promocionarse a un tipo común, por ejemplo de entero a decimal u objeto. Revisa dtypes y usa tipos anulables cuando corresponda. Las categorías también requieren atención: conjuntos de categorías diferentes pueden perder el dtype categórico.

Parámetros importantes

Además de axis, join e ignore_index, names etiqueta niveles creados con keys; sort controla la ordenación de columnas no alineadas; copy ha cambiado de comportamiento a medida que pandas evoluciona, por lo que debes consultar la documentación de tu versión.

Flujo seguro

Normaliza cada lote, comprueba el esquema, añade procedencia, concatena una sola vez y valida el resultado. Conserva métricas como número de filas, duplicados por clave y porcentaje de nulos. Estas comprobaciones convierten una unión rápida en un pipeline reproducible.

Continúa aprendiendo

Amplía este tema con nuestras guías sobre loc e iloc en pandas, limpieza de datos, Parquet frente a CSV.

Fuentes oficiales

Preguntas frecuentes

¿Qué hace pandas concat?
Combina Series o DataFrames a lo largo de filas o columnas y alinea los demás ejes por sus etiquetas.

¿Cuándo uso ignore_index=True?
Cuando los índices de entrada no tienen significado y quieres un índice consecutivo nuevo en el resultado.

¿Cuál es la diferencia entre concat y merge?
concat apila objetos por un eje; merge relaciona filas mediante una o varias claves de negocio.

¿Qué ocurre si las columnas son diferentes?
La unión externa predeterminada conserva todas y crea nulos. join='inner' conserva solo las columnas comunes.

¿Por qué no debo concatenar en cada iteración?
Porque se crean y copian DataFrames repetidamente. Es mejor reunir las partes en una lista y concatenar una vez.

¿Cómo conservo el origen de cada lote?
Usa keys para crear un índice jerárquico o añade una columna de procedencia antes de concatenar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir