Aller au contenu

Pandas

Objectifs de la section

2-7 Bibliothèques du langage qui permettent de manipuler des fichiers structurés (CSV)

Temps requis

60 minutes


Pandas est une bibliothèque qui permet la manipulation d'ensembles de données. Il définit des objets Python appelés Series et DataFrame pour contenir des données dans un format à deux dimensions (semblable à un tableau Excel). Bien qu'on puisse créer de toute pièce des Series et des DataFrame il est plus fréquent de les importer d'un fichier Excel ou CSV (comma separated value).

Avant de se lancer dans Pandas, il est fortement suggéré de lire les deux pages suivantes :

Concepts de base de Pandas

Les Series sont les objets de bases de Pandas. Elles permettent de représenter une collection de données. Elles sont très semblables aux tableaux numpy. Pandas présente des tableaux avec un système d'indice de lignes et de colonnes. Les tableaux sont des objets DataFrame. Chaque colonne est une Series. Dans cette page nous verrons :

  • L'importation de fichiers;
  • Afficher la structure et le contenu d'un DataFrame;
  • Manipuler les données.

Pandas propose beaucoup plus de fonctions que ce qui est décrit ici. N'hésitez pas à consulter la documentation officielle. Bien qu'elle ne soit disponible qu'en anglais, les intelligences artificielles peuvent vous aider à traduire.

Importer un fichier

Les DataFrame sont importés d'un fichier. On peut importer un fichier dans plusieurs formats. Nous verrons comment traiter les deux les plus communs : les fichiers Excel et les fichiers CSV.

Excel

Pour importer un fichier Excel, il est nécessaire d'installer le paquet openpyxl (voir installer un paquet avec pip ). Mais si vous utilisez Pandas, celui-ci l'importe automatiquement lors de son utilisation. La fonction à utiliser est read_excel qui, dans la documentation, a la signature suivante. La fonction retourne un DataFrame avec le contenu du fichier Excel. En dessous sont présentés les principaux paramètres de la fonction.

Fonction read_excel
pandas.read_excel(io, sheet_name=0, *, header=0, names=None, index_col=None, usecols=None, dtype=None, 
    engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, 
    na_values=None, keep_default_na=True, na_filter=True, verbose=False, parse_dates=False, 
    date_parser=<no_default>, date_format=None, thousands=None, decimal='.', comment=None, skipfooter=0, 
    storage_options=None, dtype_backend=<no_default>, engine_kwargs=None)

Paramètre Valeur par défaut Fonctionnement
io Le chemin du fichier à charger.
sheet_name 0 L'indice de la feuille à charger (0 pour la première), le nom sous forme de chaîne de caractères ou une liste de feuilles à charger.
header 0 L'indice de la ligne (0 pour la première) à utiliser.
index_col None L'indice de la colonne à utiliser pour identifier les lignes. Si None, alors des indices à partir 0 sont utilisés pour numérotés les lignes.
thousands None Le caractère de séparation des milliers. En anglais, on peut mettre des virgules entre chaque groupe de 3 chiffres.
decimal . Le caractère de séparation des décimales pour les nombres à virgule.

Données de consommation Hydro-Québec du 17 au 20 mars 2025.

HYDRO-QUÉBEC. (2022). Estimation des émissions directes de GES associées à l’électricité consommée au Québec [Jeu de données]. https://donnees.hydroquebec.com/explore/dataset/estimation-emissions-directes-ges/information/.

La méthode head de DataFrame permet de sélectionner les 5 premières lignes. C'est utile pour s'assurer que les données ont bien été importées.

Importer les données GES
import pandas as pd

donnees = pd.read_excel("estimation-emissions-directes-ges.xlsx")
print(donnees.head())

Emplacement du fichier

Un chemin relatif est utilisé dans l'exemple. Votre fichier Excel doit être enregistré au même endroit sur votre disque que le fichier de code Python.

CSV

Un fichier CSV est de format texte, donc lisible par un humain sans application particulière. Ce format est souvent utilisé pour le partage de données sur internet et par les équipments de laboratoire scientifiques. Il présente les données sous forme de grille avec un caractère particulier (souvent la virgule ou le point-virgule) pour séparer les colonnes.

On charge un fichier CSV avec la fonction read_csv qui se comporte comme read_excel à la différence d'un paramètre très important.

Le paramètre sep permet de définir le caractère qui sépare les colonnes. Le format CSV standard (anglais) utilise la virgule pour séparer les colonnes et le point pour séparer les décimales. Dans le format français que l'on rencontre parfois, c'est le point-virgule qui sert à séparer les colonnes, la virgule servant à délimiter les nombres décimaux. Il peut être nécessaire d'ouvrir le fichier avec bloc-notes pour observer sa structure avant de l'importer en Python.

Obtenir des informations sur la structure d'un DataFrame

Plusieurs informations de la structure d'un DataFrame peuvent être affichés avec des propriétés de celui-ci (on suppose ici que le DataFrame est dans une variable appelée donnees). Ces informations peuvent être utiles pour valider la bonne lecture des données ou pour permettre d'écrire des codes génériques.

Le nombre de colonnes
len(donnees.columns). Retourne le nombre de colonnes.
Le nom des colonnes
donnees.columns.values. Retourne un tableau qui contient le nom des colonnes.
Les dimensions du tableau
donnees.shape. Retourne un tuple avec le nombre de lignes à l'indice 0 et le nombre de colonnes à l'indice 1.
Le nombre de données
donnees.size. Retourne le nombre d'éléments dans le tableau. S'il n'y a pas d'élément manquant, cela correspond au nombre de lignes multiplé par le nombre de colonnes.

Afficher des données du DataFrame

Il y a deux façons d'accéder aux données d'un DataFrame, soit par le nom des colonnes pour retourner une Series, ou par le système d'indices.

Par le nom des colonnes

Pour sélectionner une colonne, on utilise l'opérateur [ ] avec le nom de la colonne comme chaîne de caractères. Par exemple, pour sélectionner que la colonne d'estimation de production de GES la ligne à utiliser est la suivante :

Sélectionner une colonne par son nom
production_ges = donnees["quebec_estimation_consommation_ges_total"]

Par les indices

Pour sélectionner une donnée par les indices, on doit travailler avec la propriété iloc et son opérateur [ ]. Il accepte deux paramètres, soit les indices des lignes à sélectionner et les indices des colonnes à sélectionner. Voici différents usages de la propriété iloc.

Sélection des données par indice` linenums=
# Sélectionner la donnée de la ligne 1, colonne 3
donnees.iloc[1, 3]

# Sélectionner toute la ligne 2
donnees.iloc[2, ]

# Sélectionner toute la colonne 3
donnees.iloc[:, 3]

On peut utiliser les opérateurs de découpage (slicing) pour sélectionner une plage de ligne ou de colonne.

Sélection des données par indice avec découpage
1
2
3
4
5
6
7
8
# Sélectionner les lignes 5 à 10
donnees.iloc[5:11,]

# Sélectionner les colonnes 2 à 4
donnees.iloc[:, 2:5]

# Sélectionner les 24 dernières heures (tant que notre jeu de données est trié par date)
donnees.iloc[-24:,]

Nettoyer les données

Lorsque l'on importe un jeu de données, il arrive que celui soit incomplet. Il génère des entrées de types « N/A » pour not available. Ces entrées peuvent poser problème lorsque l'on fait des traitements.

La fonction isna permet de tester si une valeur est de type « N/A ». Elle retourne une dataframe avec un booléen indiquant si la valeur est nulle N/A ou non. On peut ensuite appeler la méthode any pour vérifier si au moins un des booléens est vrai.

Déterminer s'il y a des valeurs vides
donnees.isna().any().any()  

Pourquoi appeler any 2 fois ?

Parce que le premier appel retourne une Series qui indique, pour chaque colonne, s'il y en a (True ou False). Cela peut être utile dans le cas où vous détectez des valeurs N/A afin de les localiser. Le deuxième appel vérifie si la Series contient-elle même une valeur True.

Une fois identifié, on peut les retirer des données avec la méthode dropna. Cette méthode retourne un nouveau DataFrame sans les lignes qui contiennent un ou plusieurs N/A.

Retirer les valeurs vides
donnees_filtrees = donnees.dropna()  

Le parametre inplace

La plupart des méthodes qui modifient la structure d'un DataFrame ou qui en retourne un nouveau accepte un paramètre nommé inplace. Par défaut sa valeur est False, mais lorsqu'on le met à True, la méthode modifie le DataFrame plutôt que d'en retourner une copie avec la modification.

Retirer les valeurs vides
# Crée une copie et les valeurs vides sont toujours dans donnees
donnees_filtrees = donnees.dropna()  

# Ne crée pas de copie, les lignes sont directement supprimées de données
donnees.dropna(inplace=True)

Manipuler les données

Une fois les données importées, il faut opérer des traitements dessus. On présente trois types de traitement :

  • Tri
  • Opérations mathématiques
  • Fonctions mathématiques

Trier les données

La méthode sort_values permet de trier les données selon une colonne déterminée. La fonction retourne un DataFrame trié ou tri directement dans le DataFrame si le paramètre inplace est True.

Paramètre Valeur par défaut Fonctionnement
by La ou les colonnes par lesquelles trier. On peut utiliser les indices ou les noms.
inplace False Indique si le tri est fait dans une copie (par défaut) ou dans le présent DataFrame
ascending True Indique si en ordre croissant (par défaut) ou en ordre décroissant (False)

Trier un DataFrame
1
2
3
4
5
# Tri les données
donnees_triees = donnees.sort_values("Date")

# Tri par consommation électrique en ordre décroissant, dans le même DataFrame
donnees.sort_values("quebec_consommation_sources_total", inplace=True, ascending=False)

Renuméroter les lignes

Le tri des données conserve les numéros de lignes (indices des lignes) initiaux. Les numéros d'identification ne sont donc plus séquentiels. Dans certains cas, on pourrait souhaiter les réinitialiser afin que l'utilisation de iloc corresponde aux numéros des lignes. Pour ce faire, on utilise la méthode reset_index avec le paramètre inplaceà True.

Opérations mathématiques

On peut utiliser les opérations mathématiques entre les Series, comme pour les tableaux numpy. Si on souhaite par exemple avoir le pourcentage de production de source hydraulique par rapport à la consommation totale, on peut simplement diviser les deux Series entre elles.

Le résultat de l'opération sera une Series avec le résultat de l'opération appliquée entre chaque paire d'éléments correspondants. Évidement, en cas de présence de N/A sur une ligne, cela empêche de calculer un résultat pour cette ligne.

Opérations mathématiques entre Series
pourcentage_hydroelectrique = donnees["quebec_consommation_sources_hydraulique"] / donnees["quebec_consommation_sources_total"]

print(pourcentage_hydroelectrique)

# Affiche 
# 0     0.744411
# 1     0.739338
# 2     0.738965
# 3     0.744870
# 4     0.758518
# ...

Fonctions mathématiques et statistiques

Au-delà des opérations mathématiques, Pandas permet d'appliquer plusieurs fonctions mathématiques ou statistiques sur une Series. En dessous du capot, Pandas s'appuie sur numpy pour faire ces opérations.

Opération Méthode Effet
Somme sum Calcule la somme des éléments de la Series.
Somme cumulative cumsum Calcule la somme cumulative des éléments de la Series. Retourne une série avec les sommes partielles.
Maximum max Retourne le maximum de la Series.
Index du maximum idxmax Retourne l'indice du maximum.
Minimum min Retourne le minimum de la Series.
Index du minimum idxmin Retourne l'indice du minimum.
Moyenne mean La moyenne de la Series
Écart-type std L'écart-type de la Series
Médiane median La médiane de la Series
Mode mode Retourne le ou les modes de la Series
Corrélation corr Retourne le coefficient de corrélation de Pearson avec une autre Series passée en paramètres
Compter les valeurs value_counts Compte le nombre d'occurrences de chaque valeur
Valeur absolue abs Retourne une série avec les valeurs absolues de chacune des valeurs

Toutes ces fonctions acceptent un paramètre qui leur permet d'ignorer les valeurs N/A, donc on peut les utiliser sans provoquer constamment d'erreur à cause des N/A. Également, elles ont un paramètre numeric_only qui permet d'éviter les colonnes qui contiennent autre chose que des nombres.

Lorsqu'on les appelle sur des DataFrame, elles font le calcul pour chaque Series et retourne un DataFrame d'une ligne avec le résultat (sauf pour cumsum et abs, car ces méthodes retournes des Series).

Les tests logiques et la méthode apply

Des méthodes existent aussi pour faire des tests logiques sur chaque élément (>, <, == ...). La méthode apply permet aussi d'appliquer n'importe quelle fonction sur les éléments d'une Series, y compris des fonctions que vous définissez vous-même.

Enregistrer un fichier Excel

Après avoir modifié un dataframe ou d'avoir calculer des informations sur le fichier, il peut être intéressant de le sauvegarder. Pour ce faire, on utilise la méthode to_excel de l'objet DataFrame. Cette méthode accepte un paramètre : le chemin du fichier dans lequel enregistrer le DataFrame. Il faut que le nom de fichier contienne l'extension xlsx pour s'assurer que le fichier soit reconnu par Excel.

Enregistrement d'un fichier
1
2
3
4
5
6
7
8
import pandas as pd

donnees = pd.read_csv("mon_fichier.csv")

# On calcule les moyennes
moyennes = donnees.mean()

moyennes.to_excel("analyse/moyennes.xlsx")      # Enregistre les moyennes dans un fichier

Démonstration

  • Sélectionner uniquement les données du 17 mars.
  • Trouver le moment avec la plus grande consommation éolienne.
  • Quel est le taux de production d'hydroélectricité (par rapport à la production électrique totale) au moment de la plus petite émission de GES ?
  • Créer un dictionnaire avec le pourcentage moyen de consommation horaire pour chaque source de consommation électrique.

Exercices

Données annuelles de fréquentations des urgences du Québec 2021-2024.

MINISTÈRE DE LA SANTÉ ET DES SERVICES SOCIAUX. Fichier cumulatif des données des urgences, [Jeu de données], dans Données Québec, 2023, mis à jour le 16 mars 2025. https://www.donneesquebec.ca/recherche/dataset/fichier-cumulatif-des-donnees-des-urgences, (consulté le 19 mars 2025).