¿Cómo unir DataFrames con concat() en pandas?
Respuesta corta: pd.concat() pega varios DataFrames en uno. Por defecto los apila uno debajo de otro (axis=0). Con axis=1 los pone uno al lado de otro, y con ignore_index=True renumera las filas.
import pandas as pd
enero = pd.DataFrame({"producto": ["Café", "Té"], "ventas": [120, 80]})
febrero = pd.DataFrame({"producto": ["Café", "Té"], "ventas": [150, 95]})
print(pd.concat([enero, febrero], ignore_index=True)) producto ventas
0 Café 120
1 Té 80
2 Café 150
3 Té 95Los DataFrames van siempre dentro de una lista. Sin ignore_index=True, el resultado conserva los índices originales y verás 0, 1, 0, 1.
axis=0 apila filas y axis=1 pega columnas.
Sintaxis de pd.concat()
pd.concat(
objs,
axis=0,
join="outer",
ignore_index=False,
keys=None,
names=None,
verify_integrity=False,
sort=False,
)| Parámetro | Qué hace |
|---|---|
objs | La lista de DataFrames o Series que quieres unir |
axis | 0 apila filas (por defecto) y 1 pega columnas |
join | "outer" conserva todas las columnas y "inner" solo las comunes |
ignore_index | Crea un índice nuevo 0, 1, 2... |
keys | Añade una etiqueta por cada DataFrame de origen |
names | Nombres para los niveles del índice que crea keys |
verify_integrity | Da error si el resultado tiene índices repetidos |
sort | Ordena las columnas cuando no coinciden |
Ejemplos de concat() en pandas
Apilar filas con los índices originales
print(pd.concat([enero, febrero])) producto ventas
0 Café 120
1 Té 80
0 Café 150
1 Té 95Los índices repetidos dan problemas al usar loc, así que en la mayoría de casos conviene ignore_index=True.
Saber de qué DataFrame viene cada fila
Con keys, cada bloque lleva su etiqueta en el índice:
ventas = pd.concat([enero, febrero], keys=["ene", "feb"])
print(ventas) producto ventas
ene 0 Café 120
1 Té 80
feb 0 Café 150
1 Té 95ventas.loc["feb"] devuelve solo las filas de febrero. Si prefieres una columna normal, añádela antes de unir: pd.concat([enero.assign(mes="ene"), febrero.assign(mes="feb")], ignore_index=True).
Pegar columnas con axis=1
precios = pd.DataFrame({"precio": [2.5, 2.0]})
print(pd.concat([enero, precios], axis=1)) producto ventas precio
0 Café 120 2.5
1 Té 80 2.0Con axis=1 pandas alinea las filas por el índice, no por su posición. Si los índices no coinciden, aparecen NaN.
DataFrames con columnas distintas
marzo = pd.DataFrame({"producto": ["Café"], "ventas": [130], "tienda": ["Centro"]})
print(pd.concat([enero, marzo], ignore_index=True)) producto ventas tienda
0 Café 120 NaN
1 Té 80 NaN
2 Café 130 CentroCon join="inner" el resultado se queda solo con las columnas que tienen todos: producto y ventas.
Añadir una fila a un DataFrame
append() ya no existe en pandas 2 ni en pandas 3. Para añadir filas, crea un DataFrame con ellas y únelo con concat():
nueva = pd.DataFrame([{"producto": "Agua", "ventas": 40}])
enero = pd.concat([enero, nueva], ignore_index=True)Unir muchos archivos CSV
from pathlib import Path
archivos = sorted(Path("datos").glob("ventas_*.csv"))
todo = pd.concat([pd.read_csv(f) for f in archivos], ignore_index=True)Crear una lista y llamar a concat() una sola vez es mucho más rápido que unir dentro de un bucle.
