Power Query et Python font partie des outils les plus utilisés pour préparer et transformer des données avant analyse. Power Query a rendu cette préparation accessible en habillant chaque transformation d'un clic dans une interface, sans qu'il soit nécessaire, en apparence du moins, de savoir qu'il génère du code en coulisses. Python demande d'écrire ce code soi-même, avec en échange une marge de manœuvre bien plus importante : la latitude des transformations réalisables, la volumétrie de données supportée, et la possibilité d'aller au-delà de la seule manipulation de données.
Chacun a ses avantages, mais encore faut-il savoir précisément les identifier, et aller au-delà des croyances courantes. Voici un comparatif concret pour savoir lequel correspond à votre besoin, et jusqu'où chacun va vraiment.
Ce que Power Query fait très bien
Power Query permet de se connecter à peu près à n'importe quelle source (fichiers, dossiers, bases de données, pages web), puis de filtrer, renommer, pivoter ou fusionner des tables sans écrire une ligne de code. Chaque transformation s'ajoute comme une étape dans le panneau "Étapes appliquées", visible et modifiable à tout moment. Une fois la requête construite, il suffit d'un clic pour l'actualiser quand les données sources changent.
Directement intégré à Excel et Power BI, sans installation, il s'avère très pratique pour les utilisateurs de la suite Office, que ce soit pour transformer des données avant une analyse sous Excel ou avant une visualisation sous Power BI.
Son fonctionnement a de quoi séduire les utilisateurs peu accoutumés au traitement de données : une interface compréhensible par tous, un résultat visible à chaque étape. Ce que l'interface ne montre pas, en revanche, c'est que chacune de ces étapes est traduite en langage M, selon une interprétation que l'utilisateur ne voit jamais s'il ne va pas la vérifier, et sans optimisation ni commentaire. Et c'est précisément là que les choses se compliquent.
Là où l'interface de Power Query montre ses limites
Power Query suffit très bien pour un besoin simple, et peut suffire pour un besoin récurrent à condition de nettoyer et structurer le code M généré, pour en favoriser l'efficacité et la maintenabilité. Il montre en revanche vite ses limites sur des tâches volumineuses, ou qui dépassent un certain seuil de complexité :
- Une interprétation qu'on ne contrôle pas. Vos clics sont traduits en code M selon la logique de la machine, pas la vôtre. Si une colonne de dates contient "11-02-2026" et qu'un clic en extrait "11", rien ne garantit qu'il s'agit du jour plutôt que des deux premiers caractères de la chaîne : pour le vérifier, il faut aller lire le code M généré.
- Une lisibilité qui se dégrade vite. Une succession de clics dans l'interface devient rapidement difficile à suivre, quand un script structuré et commenté reste lisible bien plus longtemps.
- Une performance qui demande d'aller dans le code. Power Query montre ses limites sur de gros volumes ou un grand nombre de fichiers à combiner. Des solutions existent, comme
Table.Buffer(), mais elles ne sont accessibles qu'en éditant directement le langage M. - Un langage de requêtage, pas un langage d'action. M transforme des tables, mais ne sait pas déclencher une action à partir d'un résultat : une alerte, un message, un envoi. Il possède bien un
if...then...else, mais comme une formule SI() d'Excel : il retourne une valeur selon une condition, il ne déclenche pas l'exécution d'une suite d'instructions. Repérer qu'un centre de coûts dépasse un budget est une chose, le signaler activement en est une autre, hors de portée de Power Query seul (l'exemple ci-dessous l'illustre). M reste aussi un langage fonctionnel : il n'a pas de bouclesforouwhilecomme les langages de programmation classiques, l'itération s'y pense différemment (récursion, fonctions appliquées à des listes), une logique moins intuitive pour qui n'a jamais programmé.
Du fait de ces limites, et d'une tendance des utilisateurs de Power Query à ne pas accéder au code M (ce que l'on comprend, tant l'un des avantages les plus mis en avant de l'outil est justement, et à tort, de ne pas avoir à toucher au code), beaucoup de solutions construites avec Power Query souffrent d'un manque de maintenabilité, responsable d'une dette technique importante côté métier.
Un exemple concret
Voici, à titre d'illustration, la logique que Power Query génère automatiquement (sans que vous ayez besoin de l'écrire vous-même) pour combiner plusieurs fichiers d'un dossier et regrouper les montants par centre de coûts :
let
Source = Folder.Files("C:\exports_mensuels"),
FichiersExcel = Table.SelectRows(Source, each Text.EndsWith([Name], ".xlsx")),
DonneesExtraites = Table.AddColumn(FichiersExcel, "Contenu", each Excel.Workbook([Content]){[Item="Feuil1"]}[Data]),
DonneesCombinees = Table.Combine(DonneesExtraites[Contenu]),
Regroupement = Table.Group(DonneesCombinees, {"centre_de_cout"}, montant_total)
in
Regroupement
Ce code, vous ne l'écrivez presque jamais : il se construit au fil des clics, dossier sélectionné, colonnes ajustées, regroupement fait par glisser-déposer. C'est précisément la force de Power Query : rendre cette logique invisible. Mais c'est aussi sa faiblesse, car pour produire réellement un code maîtrisé, efficace et maintenable, il faut éditer ce code M directement, sans le confort de l'interface.
Voici la même logique en Python, avec pandas :
import pandas as pd
from pathlib import Path
dossier_source = Path("exports_mensuels")
fichiers = dossier_source.glob("*.xlsx")
donnees = pd.concat([pd.read_excel(f) for f in fichiers], ignore_index=True)
rapport = (
donnees
.groupby("centre_de_cout", as_index=False)
.agg({"montant": "sum"})
)
La logique est la même, mais elle est écrite explicitement, ligne par ligne, plutôt que déduite d'une suite de clics.
Poussons l'exemple un peu plus loin : si un centre de coûts dépassait son budget, il faudrait le signaler. En Python, rien de plus simple :
seuil_alerte = 50000
for _, ligne in rapport.iterrows():
if ligne["montant"] > seuil_alerte:
print(f"Alerte : {ligne['centre_de_cout']} dépasse le seuil ({ligne['montant']} €)")
En Power Query, on peut bien ajouter une colonne calculée qui marque les lignes concernées (if [montant_total] > 50000 then "Alerte" else null), mais la requête elle-même ne peut rien faire de cette information : ni message, ni envoi, ni action. M reste un langage de requêtage, pensé pour transformer des tables, pas pour déclencher des actions.
Et Copilot, dans tout ça ?
Depuis 2026, Copilot peut générer une partie des étapes de transformation à partir d'une simple description en langage naturel, directement dans Power Query. C'est un vrai gain de confort, mais ça ne change rien au fond : ce qui s'exécute derrière reste du code M, généré cette fois par une IA plutôt que par une suite de clics. Power Query reste ce qu'il a toujours été : un outil qui rend le code invisible, pas un outil qui s'en passe. (On développe cette nuance plus en détail dans notre article sur le no-code à l'ère de l'IA.)
Le comparatif, critère par critère
| Critère | Power Query | Python |
|---|---|---|
| Installation | Intégré à Excel et Power BI | Gratuit, quelques minutes à installer |
| Prise en main | Interface visuelle, aucun code à écrire pour un usage basique | Nécessite d'apprendre une syntaxe, plus rapide avec l'aide de l'IA |
| Fiabilité de l'interprétation | L'interprétation des clics n'est pas vérifiable sans lire le code M | Explicite : ce qui est écrit est ce qui s'exécute |
| Transformations spécifiques | Nécessite d'éditer le langage M directement | S'écrit nativement, sans langage intermédiaire |
| Gros volumes | Performant si la source permet le "query folding", limité sinon | Traite confortablement plusieurs millions de lignes |
| Capacité d'action (alertes, envois) | Non : langage de requêtage uniquement | Oui, nativement |
| Portabilité | Lié au classeur Excel ou au fichier Power BI | Indépendant, exécutable n'importe où |
| Au-delà de la préparation de données | Conçu pour l'ETL uniquement | Analyse, automatisation, API, etc. : un champ de cas d'usage extrêmement large |
Faut-il abandonner Power Query pour Python ?
Power Query tire son principal avantage de son intégration native à Excel et Power BI : connecter une source, actualiser une visualisation, sans sortir de l'écosystème Microsoft. C'est un vrai atout pour quelqu'un sans aucune compétence en programmation face à un besoin ponctuel et simple.
Mais dès qu'on maîtrise les deux outils, Python reste plus confortable au quotidien, y compris sur des besoins simples : moins de clics, moins d'allers-retours entre Power Query et Power Pivot, une seule logique tenue dans un unique script plutôt qu'éclatée entre plusieurs outils. Et il y a un argument qui pèse de plus en plus lourd : Python est en train de devenir une compétence aussi incontournable qu'Excel l'est aujourd'hui pour un profil analytique. Mieux vaut donc prendre l'habitude tôt.
En résumé
- Power Query est une alternative valable pour un besoin de préparation de données simple, grâce à une interface qui rend le code M invisible. Mais cette accessibilité a un prix trop souvent passée sous silence : une interprétation qu'on ne contrôle pas, un temps d'exécution perfectible, une maintenabilité limitée, et au global, une dette technique qui s'accumule silencieusement côté métier.
- Sur les tâches volumineuses, la logique spécifique, ou tout ce qui touche à l'action (alertes, tests, gestion des erreurs...), Python a très nettement l'avantage.
- Power Query tire son avantage réel de son intégration native à Excel et Power BI, pas de sa simplicité d'usage face à Python.
- Python seul reste le plus souvent l'option avec le meilleur ratio simplicité / robustesse.
Ce comparatif rejoint les mêmes conclusions que nos articles sur Python vs VBA et sur les doublons silencieux d'une RECHERCHEV : un outil qui rend le code invisible reste utile pour un besoin ponctuel, mais devient une limite dès que le besoin dure ou se complexifie. Retrouvez l'ensemble de nos articles sur Python pour les métiers.