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.
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.
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.
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.
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