Remodelage de données Pandas (pivot / melt / stack / unstack)

Le remodelage des données est une opération courante en analyse de données, utilisée pour modifier la structure de disposition des données. Pandas fournit des fonctions telles que pivot, melt, stack et unstack pour convertir entre le format long et le format large.


pivot Tableau croisé dynamique

pivotConvertit des données au format long en format large, similaire à la fonctionnalité de tableau croisé dynamique d'Excel.

Utilisation de base

Exemple

import pandas as pd

# Créer des données au format long
df = pd.DataFrame({
    "Date": ["2024-01-01", "2024-01-01", "2024-01-02", "2024-01-02"],
    "Produit": ["A", "B", "A", "B"],
    "Ventes": [100, 150, 120, 90]
})

print("Données au format long :")
print(df)
print()

# Convertir au format large
pivot_df = df.pivot(index="Date", columns="Product", values="Sales")
print("Données au format large :")
print(pivot_df)

Index multiple

Exemple

import pandas as pd

df = pd.DataFrame({
    "Year": ["2024", "2024", "2024", "2024"],
    "Quarter": ["Q1", "Q1", "Q2", "Q2"],
    "Produit": ["A", "B", "A", "B"],
    "Ventes": [100, 150, 120, 90]
})

print("Données :")
print(df)
print()

# Pivot avec index multiple
pivot_df = df.pivot(index=["Year", "Quarter"], columns="Product", values="Sales")
print("Pivot à index multiple :")
print(pivot_df)

Fonction d'agrégation

Exemple

import pandas as pd

# Cas avec des valeurs dupliquées
df = pd.DataFrame({
    "Date": ["2024-01-01", "2024-01-01", "2024-01-01", "2024-01-02"],
    "Produit": ["A", "A", "B", "B"],
    "Ventes": [100, 110, 80, 90]
})

print("Données avec des valeurs dupliquées :")
print(df)
print()

# pivot ne prend pas en charge les valeurs dupliquées par défaut, vous devez utiliser pivot_table et spécifier une fonction d'agrégation
pivot_df = df.pivot_table(index="Date", columns="Product", values="Sales", aggfunc="sum")
print("Agrégation avec sum :")
print(pivot_df)
print()

# Utiliser mean
print("Agrégation avec mean :")
print(df.pivot_table(index="Date", columns="Product", values="Sales", aggfunc="mean"))

pivotLes valeurs en double ne sont pas autorisées ; lorsqu'il y a des valeurs en double, utilisezpivot_tableet spécifiez une fonction d'agrégation.


melt Dépivoter

meltConvertit des données au format large en format long, l'opération inverse de pivot.

Exemple

import pandas as pd

# Créer des données au format large
df = pd.DataFrame({
    "Date": ["2024-01-01", "2024-01-02"],
    "A": [100, 120],
    "B": [150, 90]
})

print("Données au format large :")
print(df)
print()

# Convertir au format long
melted = df.melt(id_vars="Date", var_name="Product", value_name="Sales")
print("Données au format long :")
print(melted)

Conserver plusieurs colonnes inchangées

Exemple

import pandas as pd

df = pd.DataFrame({
    "City": ["Beijing", "Shanghai"],
    "2023 Revenue": [1000, 800],
    "2023 Profit": [200, 150],
    "2024 Revenue": [1200, 950],
    "Bénéfice 2024": [250, 180]
})

print("Format large :")
print(df)
print()

# Conserver "City" inchangé, convertir les autres colonnes au format long
melted = df.melt(
    id_vars="City",
    var_name="Indicateur",
    value_name="Valeur"
)
print("Format long :")
print(melted)

stack et unstack

stack et unstack sont des fonctions de remaniement dédiées à MultiIndex.

unstack

Exemple

import pandas as pd

# Créer des données avec plusieurs niveaux d'index
df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": [5, 6, 7, 8]
}, index=pd.MultiIndex.from_tuples(
    [("X", 1), ("X", 2), ("Y", 1), ("Y", 2)],
    names=["Catégorie", "Nombre"]
))

print("Données d'index multi-niveaux :")
print(df)
print()

# unstack convertit l'index interne en colonnes
print("Après unstack :")
print(df.unstack())

stack

Exemple

import pandas as pd

# Créer un format large (avec index de colonnes)
df = pd.DataFrame({
    ("A", "X"): [1, 2],
    ("A", "Y"): [3, 4],
    ("B", "X"): [5, 6],
    ("B", "Y"): [7, 8]
})

print("Avec index de colonnes multi-niveaux :")
print(df)
print()

# stack convertit l'index de colonnes en index interne
print("Après stack :")
print(df.stack())

Exercice : Conversion de rapport d'entreprise

Exemple

import pandas as pd

# Simuler des données commerciales - enregistrements de ventes
sales = pd.DataFrame({
    "Date": ["2024-01"] * 4,
    "Produit": ["Téléphone", "Ordinateur", "Tablette", "Casque"],
    "Canal": ["En ligne", "En ligne", "Hors ligne", "En ligne"],
    "Sales Amount": [10000, 20000, 8000, 5000]
})

print("Données de ventes brutes :")
print(sales)
print()

# Convertir avec pivot
pivot = sales.pivot_table(
    index="Product",
    columns="Channel",
    values="Sales Amount",
    aggfunc="sum",
    fill_value=0
)
print("Pivot des ventes par canal :")
print(pivot)
print()

# Restaurer au format long
print("Restauré au format long :")
print(pivot.reset_index().melt(id_vars="Product", var_name="Channel", value_name="Sales Amount"))

Sélection de la fonction de restructuration

Fonction Objectif Scénario typique
pivot Long → Large Conversion ligne-colonne
pivot_table Long → Large (avec agrégation) Lorsqu'il y a des valeurs en double
melt Large → Long Mise en forme des données
unstack Index → Colonne Index à plusieurs niveaux
stack Colonne → Index Index à plusieurs niveaux

Le but de la restructuration des données est de rendre les données plus adaptées à l'analyse ou à la présentation. Choisissez la méthode de conversion appropriée en fonction des besoins en aval.

Autres extensions