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 ;meltmal utilisé multiplie les lignes ou perd des identifiants. - Solution : Flux tidy—
pivot_tablesi doublons,pivotsi clés uniques,meltpour passer en long,stack/unstackpour ajuster les MultiIndex.
Référence rapide
| Méthode | Direction | Quand l’utiliser | Gère les doublons ? |
|---|---|---|---|
pivot | long → wide | Clés uniques | 🚫 (erreur sur doublons) |
pivot_table | long → wide | Besoin d’agréger ou de gérer doublons | ✅ via aggfunc |
melt | wide → long | Normaliser des colonnes en lignes | N/A |
stack / unstack | wide ↔ long sur niveaux d’index | MultiIndex | N/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+quarteruniques. - 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=0donne 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")ouunstack(level=-1).
Pièges courants
| Problème | Correction |
|---|---|
ValueError: Index contains duplicate entries avec pivot | Passer à pivot_table avec agrégation. |
| Ordre de colonnes inattendu | Trier : table = table.reindex(sorted(table.columns), axis=1). |
| MultiIndex difficile à lire | Aplatir après pivot_table. |
| Valeurs manquantes après reshape | fill_value ou stack(dropna=False) pour conserver les vides. |
Conseils de workflow
- Normaliser d’abord :
melt→groupby/agg→pivot_tablepour 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
pivotpour clés uniques,pivot_tablepour agréger,meltpour passer en long.- Aplatissez le MultiIndex après les pivots complexes pour des exports propres.
- Combinez reshape et
groupbypour obtenir vite des datasets prêts à l’analyse.