logo oujood
🔍

Concaténer des DataFrames avec concat

pd.concat() assemble plusieurs DataFrames en un seul — verticalement (empiler des lignes) ou horizontalement (ajouter des colonnes). C'est la méthode à utiliser quand vous voulez réunir des données de même structure, contrairement à merge() qui joint sur une clé.

OUJOOD.COM

concat() vs merge() : quand utiliser lequel

merge() relie deux tables sur une colonne commune — il cherche des correspondances. concat() empile ou colle des tables — il n'établit aucune correspondance, il juxtapose simplement. Si vous avez les ventes de janvier et celles de février dans deux DataFrames identiques en structure, concat() est la bonne réponse. Si vous avez une table de commandes et une table de clients à relier par un identifiant, c'est merge().

Concaténation verticale : empiler des lignes

La concaténation verticale (axis=0, valeur par défaut) empile les DataFrames l'un sous l'autre. Les colonnes doivent être les mêmes — ou Pandas remplit par NaN celles qui manquent dans certains DataFrames.

  📋 Copier le code

import pandas as pd

janvier = pd.DataFrame({
    "produit": ["Clavier", "Souris"],
    "ventes":  [142, 98],
    "mois":    ["Janvier", "Janvier"]
})

fevrier = pd.DataFrame({
    "produit": ["Clavier", "Écran", "Souris"],
    "ventes":  [117, 45, 134],
    "mois":    ["Février", "Février", "Février"]
})

# Empilement vertical — index original conservé par défaut
df = pd.concat([janvier, fevrier])
print(df)
# Index : 0, 1, 0, 1, 2 — doublons d'index !

# Réinitialiser l'index après concat
df = pd.concat([janvier, fevrier], ignore_index=True)
print(df)

Sans ignore_index=True, les index originaux sont conservés — ce qui crée des doublons (0, 1, 0, 1, 2 dans l'exemple). C'est souvent source de confusion lors des accès avec loc. ignore_index=True recrée un index numérique continu de 0 à N — à utiliser systématiquement sauf si l'index original a une signification métier à préserver.

Concaténer une liste de DataFrames

Quand vous lisez plusieurs fichiers dans une boucle, la méthode standard est d'accumuler les DataFrames dans une liste puis de les concaténer en une seule passe. C'est plus efficace que d'appeler concat() à chaque itération.

  📋 Copier le code

import pandas as pd
import os

# Lire tous les CSV d'un dossier et les assembler
dossier = "données_mensuelles/"
morceaux = []

for fichier in os.listdir(dossier):
    if fichier.endswith(".csv"):
        df_temp = pd.read_csv(os.path.join(dossier, fichier))
        morceaux.append(df_temp)

# Une seule opération concat à la fin
df_complet = pd.concat(morceaux, ignore_index=True)
print(f"{len(df_complet)} lignes chargées depuis {len(morceaux)} fichiers.")

Évitez le pattern df = pd.concat([df, nouveau_df]) à l'intérieur d'une boucle — il crée un nouveau DataFrame à chaque itération et devient très lent sur de grands volumes. La liste + concat finale est systématiquement plus rapide.

Tracer l'origine des lignes avec keys

Le paramètre keys ajoute un niveau d'index supplémentaire qui identifie de quel DataFrame provient chaque ligne. Utile quand vous devez garder la traçabilité de l'origine des données après l'assemblage.

  📋 Copier le code

import pandas as pd

janvier = pd.DataFrame({"produit": ["Clavier", "Souris"], "ventes": [142, 98]})
fevrier = pd.DataFrame({"produit": ["Clavier", "Écran"],  "ventes": [117, 45]})
mars    = pd.DataFrame({"produit": ["Souris", "Écran"],   "ventes": [134, 52]})

# Ajouter une étiquette de source dans l'index
df = pd.concat(
    [janvier, fevrier, mars],
    keys=["Janvier", "Février", "Mars"]
)
print(df)

# Accéder aux données d'un mois spécifique
print(df.loc["Février"])

Concaténation horizontale : ajouter des colonnes

axis=1 colle les DataFrames côte à côte en ajoutant des colonnes. Les lignes sont alignées par leur index — les index qui ne correspondent pas produisent des NaN.

  📋 Copier le code

import pandas as pd

infos = pd.DataFrame({
    "nom": ["Alice", "Bob", "Clara"]
}, index=[0, 1, 2])

scores = pd.DataFrame({
    "score_math": [88, 74, 95],
    "score_info": [92, 81, 87]
}, index=[0, 1, 2])

# Coller les colonnes côte à côte
df = pd.concat([infos, scores], axis=1)
print(df)

La concaténation horizontale avec axis=1 est moins courante que la verticale. Elle convient quand vous avez calculé plusieurs Series ou DataFrames séparément et que vous souhaitez les réunir en un seul tableau. Si les index ne sont pas alignés, préférez merge() qui gère la correspondance explicitement.

Par carabde | Mis à jour le 26 avril 2026