Skip to content

Pandas Pivot vs Melt : bien remodeler vos données

Updated on

Le changement de format est souvent le goulot d’étranglement avant l’analyse ou la visualisation. Un mauvais choix peut dupliquer des lignes, perdre des données ou créer des tableaux larges peu exploitables.

Cadre PAS :

  • Problème : Des données wide/long désordonnées ralentissent graphiques et agrégations.
  • Agiter : pivot échoue sur les doublons ; melt mal utilisé multiplie les lignes ou perd des identifiants.
  • Solution : Flux tidy—pivot_table si doublons, pivot si clés uniques, melt pour passer en long, stack/unstack pour ajuster les MultiIndex.

Référence rapide

MéthodeDirectionQuand l’utiliserGère les doublons ?
pivotlong → wideClés uniques🚫 (erreur sur doublons)
pivot_tablelong → wideBesoin d’agréger ou de gérer doublons✅ via aggfunc
meltwide → longNormaliser des colonnes en lignesN/A
stack / unstackwide ↔ long sur niveaux d’indexMultiIndexN/A

Données d’exemple

import pandas as pd
 
sales = pd.DataFrame({
    "region": ["NA", "NA", "EU", "EU"],
    "quarter": ["Q1", "Q2", "Q1", "Q2"],
    "product": ["A", "A", "A", "A"],
    "revenue": [120, 140, 110, 150],
    "units": [10, 11, 9, 12],
})

Format large avec pivot

wide = sales.pivot(index="region", columns="quarter", values="revenue")
  • Nécessite des combinaisons region + quarter uniques.
  • Aplanissez ensuite avec .reset_index() si besoin.

Format large agrégé avec pivot_table

table = sales.pivot_table(
    index="region",
    columns="quarter",
    values="revenue",
    aggfunc="sum",
    margins=True,
    margins_name="Total"
)
  • Gère les doublons en agrégeant.
  • fill_value=0 donne une table propre pour l’export.

Plusieurs valeurs et agrégations

multi = sales.pivot_table(
    index="region",
    columns="quarter",
    values=["revenue", "units"],
    aggfunc={"revenue": "sum", "units": "mean"},
)

Aplatir les colonnes :

multi.columns = [f"{metric}_{col}" for metric, col in multi.columns]
multi = multi.reset_index()

Format long avec melt

long = sales.melt(
    id_vars=["region", "quarter"],
    value_vars=["revenue", "units"],
    var_name="metric",
    value_name="value",
)
  • Idéal pour les libs qui attendent du tidy data (une variable par colonne, une observation par ligne).
  • Contrôlez les colonnes à dé-pivoter via value_vars.

Stack et unstack pour MultiIndex

stacked = table.stack()
unstacked = stacked.unstack()
  • Réorganise les niveaux sans redéfinir les clés.
  • Choix du niveau avec stack(level="quarter") ou unstack(level=-1).

Pièges courants

ProblèmeCorrection
ValueError: Index contains duplicate entries avec pivotPasser à pivot_table avec agrégation.
Ordre de colonnes inattenduTrier : table = table.reindex(sorted(table.columns), axis=1).
MultiIndex difficile à lireAplatir après pivot_table.
Valeurs manquantes après reshapefill_value ou stack(dropna=False) pour conserver les vides.

Conseils de workflow

  • Normaliser d’abord : meltgroupby/aggpivot_table pour la présentation.
  • Pour les graphiques, restez en long ; wide convient aux rapports/exports.
  • Après pivot_table, exportez vers Excel : table.to_excel("report.xlsx").

Guides liés


À retenir

  • pivot pour clés uniques, pivot_table pour agréger, melt pour passer en long.
  • Aplatissez le MultiIndex après les pivots complexes pour des exports propres.
  • Combinez reshape et groupby pour obtenir vite des datasets prêts à l’analyse.