Tableau croisé dynamique en Python : pourquoi pandas simplifie tout

Le résultat d'une agrégation reste un DataFrame, exactement comme les données de départ — et ça change tout.

4 min de lecture

Un tableau croisé dynamique basique, quelques colonnes à agréger, ne pose aucun problème sous Excel. Les difficultés commencent dès qu'il faut ajouter une colonne calculée à cette agrégation : une moyenne, une part du total, un ratio. Une formule classique à côté du TCD ne s'adapte pas quand celui-ci change de forme, et Power Pivot, la solution native pour aller plus loin, ajoute une interface et un langage supplémentaires pour un résultat qui reste, en pratique, assez fastidieux à maintenir.

Avec pandas, la librairie de référence pour manipuler des données en Python, ce même besoin devient étonnamment simple, pour une raison structurelle : le résultat d'une agrégation reste un DataFrame, exactement comme les données de départ.

Le TCD basique, aucun souci

Regrouper des lignes par catégorie et sommer une colonne, l'usage le plus courant d'un TCD, Excel le fait très bien, avec une interface accessible et un résultat immédiat. Ce n'est pas ce cas d'usage qui pose problème.

Là où ça se complique : ajouter une colonne à l'agrégation

Le vrai casse-tête commence dès qu'il faut aller un peu plus loin : ajouter une moyenne par ligne, un ratio, une part du total, à côté des colonnes déjà agrégées. Deux options s'offrent alors, sans qu'aucune ne soit vraiment satisfaisante :

Ce que change pandas

En pandas, une agrégation part d'un DataFrame (l'équivalent d'une plage de données Excel) et aboutit à un DataFrame. Rien de spécial : le résultat se manipule exactement comme n'importe quelle autre donnée, avec les mêmes outils. Ajouter une colonne calculée à une agrégation n'est donc jamais un cas particulier, juste une ligne de code de plus :

python
import pandas as pd

rapport = (
    donnees
    .groupby("centre_de_cout", as_index=False)
    .agg(montant_total=("montant", "sum"), nombre_commandes=("montant", "count"))
)

rapport["montant_moyen"] = rapport["montant_total"] / rapport["nombre_commandes"]
rapport["part_du_total"] = rapport["montant_total"] / rapport["montant_total"].sum()

Ces deux dernières lignes fonctionnent exactement comme elles le feraient sur n'importe quel autre DataFrame, parce que c'en est un. Pas de champ calculé, pas de DAX, pas de formule à réajuster : si la source change, il suffit de relancer le script, et le résultat reste juste.

Ce même DataFrame peut tout aussi bien provenir de plusieurs fichiers combinés au préalable, sans que la logique change : le résultat d'une agrégation reste un DataFrame, quelle que soit son origine.

Le comparatif, critère par critère

CritèreTCD Excel (+ Power Pivot)pandas (Python)
Agrégation simpleTrès accessible, résultat immédiatAussi simple, une ligne de code
Ajouter une colonne calculée à l'agrégationFormule externe fragile, ou Power Pivot et son langage DAXUne ligne de code supplémentaire, sur le même DataFrame
Résultat de l'agrégationUn objet spécifique (TCD), pas une plage de données classiqueUn DataFrame, identique à n'importe quelle autre donnée
Réaction à un changement de sourceRafraîchissement manuel, formules à réajusterIl suffit de relancer le script
Nombre d'interfaces et de langages nécessairesJusqu'à trois : Excel, Power Pivot, DAXUn seul : Python et pandas

En résumé

Retrouvez l'ensemble de nos articles sur Python pour les métiers.

Questions fréquentes
Parce qu'un TCD n'est pas une simple plage de données : y ajouter un calcul suppose soit une formule externe qui ne s'adapte pas à son évolution, soit Power Pivot et son langage DAX.
DAX est le langage de formules de Power Pivot. Il repose sur des notions comme le contexte de ligne et le contexte de filtre, réputées difficiles à assimiler même pour des utilisateurs expérimentés d'Excel.
Pas nécessairement dans l'immédiat, mais dès qu'un besoin d'agrégation dépasse le cas basique (colonne calculée, plusieurs sources, mise à jour fréquente), pandas devient nettement plus confortable.

Vous perdez du temps à retravailler vos TCD à chaque mise à jour de vos données ?

Découvrir Python pour les métiers →