Concat CSVs — 3 patrones
Propósito
Tres recetas recurrentes para concatenar CSVs con pandas: (A) vertical, (B) con nombre de archivo como columna y (C) horizontal por unidad.
A) Vertical (stack)
import pandas as pd, glob
files = glob.glob("data/*.csv")
dfs = (pd.read_csv(f) for f in files)
df = pd.concat(dfs, ignore_index=True)
Útil cuando el esquema es homogéneo; si hay columnas desalineadas, revisá join='outer'
/'inner'
.
B) Vertical + “filename-as-col”
import os, pandas as pd, glob
rows = []
for f in glob.glob("data/*.csv"):
tmp = pd.read_csv(f)
tmp["source_file"] = os.path.basename(f)
rows.append(tmp)
df = pd.concat(rows, ignore_index=True)
Ventaja: trazabilidad y auditoría simple (origen por registro).
C) Horizontal por unidad (join lado a lado)
import pandas as pd
# Cada CSV tiene una clave 'unit' y columnas distintas a unir
df_a = pd.read_csv("a.csv") # unit, var_a1, var_a2
df_b = pd.read_csv("b.csv") # unit, var_b1
df_c = pd.read_csv("c.csv") # unit, var_c1, var_c2
df = df_a.merge(df_b, on="unit", how="outer").merge(df_c, on="unit", how="outer")
Atención: documentar cardinalidades esperadas y usar validate
.
Notas de performance
- Lectura en chunks si cada CSV es grande (
pd.read_csv(..., chunksize=...)
+pd.concat
). - Forzar
dtype
para evitar “object” inflado. - Evitar concatenar dentro de loops crecientes (O(n²)): acumular en lista y un solo
concat
.
QA mínimo
- Chequear
df.shape
vs suma de fuentes (vertical) o universo esperado (horizontal). - Verificar duplicados en clave (
df.duplicated(['unit']).sum()
en joins 1:1). - Si hay columnas homónimas, renombrar antes de concatenar/mergear.