pivot_table : tableau croisé
Créez des tableaux croisés de type Excel avec pd.pivot_table en définissant l’index, les colonnes, les valeurs et aggfunc.
pivot_table : tableau croisé est une leçon Pandas & NumPy Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Pandas & NumPy Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Pandas & NumPy Academy comprend 4 leçons au total.
Qu’est-ce qu’un tableau croisé dynamique ?
Un tableau croisé dynamique est un tableau à double entrée qui résume les données selon deux dimensions catégorielles : l’une constitue les lignes et l’autre les colonnes, avec une valeur agrégée dans chaque cellule. Si vous avez déjà créé un tableau croisé dynamique dans Excel, vous reconnaîtrez immédiatement le concept. Pandas fournit pd.pivot_table() (ainsi que la version sous forme de méthode de DataFrame) pour créer entièrement ces synthèses en Python.
Appel de base à pivot_table
Les quatre paramètres essentiels de pd.pivot_table() sont : values (la colonne à agréger), index (la colonne qui devient les lignes), columns (la colonne qui devient les colonnes) et aggfunc (la fonction d’agrégation, qui vaut 'mean' par défaut). Le résultat est un DataFrame dont chaque cellule contient la valeur agrégée pour la combinaison de ligne et de colonne correspondante.
import pandas as pd
df = pd.DataFrame({
'region': ['East', 'West', 'East', 'West', 'East', 'West'],
'product': ['A', 'A', 'B', 'B', 'A', 'B'],
'revenue': [200, 340, 150, 290, 310, 410]
})
table = pd.pivot_table(df,
values='revenue',
index='region',
columns='product',
aggfunc='sum')
print(table)
# product A B
# region
# East 510 150
# West 340 700Choisir la fonction aggfunc
Le paramètre aggfunc accepte le nom sous forme de chaîne de caractères de toute fonction d’agrégation de NumPy/Pandas, une fonction appelable ou une liste de fonctions appelables. Parmi les choix courants : 'sum' pour les totaux, 'mean' pour les moyennes, 'count' pour les fréquences et 'min'/'max' pour les valeurs extrêmes. Lorsque vous transmettez une liste, chaque agrégation obtient son propre niveau dans le MultiIndex des colonnes.
# Using mean (default)
table_mean = pd.pivot_table(df, values='revenue',
index='region', columns='product',
aggfunc='mean')
print(table_mean.round(1))
# product A B
# region
# East 255.0 150.0
# West 340.0 350.0
# Using count
table_count = pd.pivot_table(df, values='revenue',
index='region', columns='product',
aggfunc='count')
print(table_count)Gérer les cellules manquantes avec fill_value
Lorsqu’une combinaison de libellés de ligne et de colonne ne contient aucune donnée, la cellule contient NaN par défaut. Transmettez fill_value pour remplacer ces cellules manquantes par une valeur par défaut pertinente, comme 0 pour des comptages ou des revenus. Le tableau est ainsi plus facile à lire et les opérations arithmétiques ultérieures ne produisent pas silencieusement de résultats NaN.
df2 = pd.DataFrame({
'region': ['East', 'West', 'East'],
'product': ['A', 'A', 'B'],
'revenue': [200, 340, 150]
})
# West-B combination has no data -> NaN by default
table = pd.pivot_table(df2, values='revenue', index='region',
columns='product', aggfunc='sum', fill_value=0)
print(table)
# product A B
# region
# East 200 150
# West 340 0 <- filled with 0 instead of NaNAjouter des sous-totaux avec margins
Transmettez margins=True pour ajouter les totaux des lignes et des colonnes au tableau croisé dynamique. Pandas ajoute une ligne 'All' en bas et une colonne 'All' à droite, contenant les valeurs agrégées pour toutes les catégories. Vous pouvez renommer le libellé de la marge avec margins_name. Cela correspond à la ligne « Total général » des tableaux croisés dynamiques Excel.
table = pd.pivot_table(df, values='revenue', index='region',
columns='product', aggfunc='sum',
fill_value=0, margins=True, margins_name='Total')
print(table)
# product A B Total
# region
# East 510 150 660
# West 340 700 1040
# Total 850 850 1700Plusieurs valeurs dans pivot_table
Le paramètre values peut être une liste de noms de colonnes afin d’agréger plusieurs indicateurs à la fois. Le résultat possède un MultiIndex de colonnes dont le niveau extérieur est la colonne de valeurs et le niveau intérieur la catégorie. Vous pouvez ainsi créer une table récapitulative complète en un seul appel, au lieu de créer puis de fusionner plusieurs tableaux croisés dynamiques distincts.
df['units'] = [10, 15, 8, 12, 14, 18]
table = pd.pivot_table(df,
values=['revenue', 'units'],
index='region',
columns='product',
aggfunc='sum')
print(table)
# Columns: (revenue, A), (revenue, B), (units, A), (units, B)
print(table.columns.tolist())Index et colonnes hiérarchiques
Lorsque vous transmettez une liste à index ou à columns, le tableau croisé dynamique possède un MultiIndex sur l’axe correspondant. Vous pouvez ainsi créer des synthèses plus détaillées, par exemple en ventilant le revenu par région et par trimestre dans les lignes, et par produit dans les colonnes. Accédez aux sous-niveaux avec .loc et les tuples d’index comme d’habitude.
df['quarter'] = ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q2']
table = pd.pivot_table(df, values='revenue',
index=['region', 'quarter'],
columns='product',
aggfunc='sum', fill_value=0)
print(table)
# product A B
# region quarter
# East Q1 510 0
# Q2 0 150
# West Q1 340 0
# Q2 0 700Aplatir le résultat
Après la création d’un tableau croisé dynamique, l’index correspond à la colonne de regroupement et le MultiIndex des colonnes (lorsque plusieurs valeurs sont utilisées) peut être peu pratique. Une méthode courante de mise en forme consiste à appeler reset_index() pour aplatir l’index des lignes, puis à réduire le MultiIndex des colonnes à un seul niveau en joignant ses niveaux avec un trait de soulignement à l’aide d’une compréhension de liste.
table = pd.pivot_table(df, values=['revenue', 'units'],
index='region', columns='product', aggfunc='sum')
# Flatten MultiIndex columns
table.columns = ['_'.join(str(c) for c in col) for col in table.columns]
table = table.reset_index()
print(table.columns.tolist())
# ['region', 'revenue_A', 'revenue_B', 'units_A', 'units_B']pivot_table ou groupby().agg()
pivot_table et groupby().agg() produisent tous deux des statistiques récapitulatives. La différence réside dans la forme du résultat : groupby().agg() renvoie un DataFrame au format long, avec une ligne par combinaison de groupes, tandis que pivot_table renvoie un tableau au format large, dans lequel une dimension devient les colonnes. Pour les tableaux de bord et les rapports, le format large des tableaux croisés dynamiques est souvent plus lisible ; pour l’apprentissage automatique ou l’analyse statistique, le format long est préférable.
# Long format (groupby)
long = df.groupby(['region', 'product'])['revenue'].sum().reset_index()
print(long)
# region product revenue
# East A 510
# East B 150
# Wide format (pivot_table)
wide = pd.pivot_table(df, 'revenue', 'region', 'product', 'sum', fill_value=0)
print(wide)
# product A B
# region
# East 510 150Trier et mettre en forme le tableau croisé dynamique
Un tableau croisé dynamique est un DataFrame ordinaire : vous pouvez donc le trier, calculer des colonnes dérivées et le mettre en forme exactement comme n’importe quel autre DataFrame Pandas. Par exemple, triez selon une colonne de produit donnée dans l’ordre décroissant pour classer les régions selon les performances de ce produit, ou ajoutez une colonne de pourcentage en divisant chaque cellule par le total de sa ligne.
table = pd.pivot_table(df, 'revenue', 'region', 'product', 'sum', fill_value=0)
# Sort by product A revenue descending
table_sorted = table.sort_values('A', ascending=False)
print(table_sorted)
# Add percentage of row total
table['A_pct'] = (table['A'] / table.sum(axis=1) * 100).round(1)
print(table)Application pratique : tableau de bord des ventes
Les tableaux croisés dynamiques sont un outil essentiel pour créer des rapports de gestion et des tableaux de bord. Voici un flux de travail courant : charger les données brutes des transactions, créer un tableau croisé dynamique avec les mois en colonnes et les catégories de produits en lignes, ajouter les totaux de marge, puis exporter le résultat vers Excel. L’ensemble du processus, des données brutes à un tableau prêt à être présenté à la direction, ne nécessite que quelques appels à Pandas.
# Simulated monthly product revenue pivot
result = pd.pivot_table(
df,
values='revenue',
index='product',
columns='region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total'
)
print(result)
# Export to Excel
# result.to_excel('sales_pivot.xlsx')Vérification rapide
Vérifiez votre compréhension de pd.pivot_table dans cette leçon.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que pd.pivot_table() crée des synthèses sous forme de tableaux croisés, avec une dimension en lignes et l’autre en colonnes ; que fill_value gère les cellules manquantes et que margins=True ajoute les totaux ; que vous pouvez agréger plusieurs valeurs à la fois ; et que les tableaux croisés dynamiques produisent un résultat au format large, idéal pour les rapports. Nous allons maintenant étudier l’opération inverse : melt(), qui permet de reconvertir des données larges au format long.
Apprends Python avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 30
- Leçons
- 120
Questions Fréquemment Posées
La leçon « pivot_table : tableau croisé » est-elle gratuite ?
Oui — le texte complet de « pivot_table : tableau croisé » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Pandas & NumPy Academy, passe à CoddyKit PRO. Le cours Pandas & NumPy Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « pivot_table : tableau croisé » ?
Créez des tableaux croisés de type Excel avec pd.pivot_table en définissant l’index, les colonnes, les valeurs et aggfunc. Tu pratiques Pandas & NumPy Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Pandas & NumPy Academy ?
Aucune expérience préalable n'est requise. Pandas & NumPy Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « pivot_table : tableau croisé » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Pandas & NumPy Academy ?
Oui. Chaque leçon Pandas & NumPy Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- pivot_table : tableau croisé
- melt : du format large au format long
- stack et unstack avec MultiIndex
- crosstab pour les tableaux de fréquences