Itérer sur un dataframe Pandas (Partie 2/3)

Itérer efficacement avec les compréhensions de liste

Nous avons vu dans une première partie de cette série d'articles 4 méthodes pour itérer sur les lignes d'un dataframe Pandas. La méthode iterrows, les boucles for, la méthode apply et enfin la méthode itertuples. Ces 4 méthodes se sont révélées peu performantes.
Dans cette seconde partie, nous allons évoquer les compréhensions de liste.

Que sont les compréhensions de liste ?

Il peut s'agir en effet d'un terme bien étrange pour qui découvre Python. Il faut savoir que cette syntaxe offre la possibilité au développeur de créer une nouvelle liste avec une seule ligne de code, là ou il faudrait, sans cette syntaxe, utiliser une boucle for et une condition.
Pour preuve, voici ci-dessous comment nous pouvons créer une nouvelle liste dont les éléments sont issus de la sélection d'une liste existante. Ici nous voulons ne retenir que les races de chats contenant la suite de lettres "in" :


chats = ["persan", "siamois", "mandarin", "chartreux", "abyssin", "balinais"]
maliste = []

for race in chats:
  if "in" in race:
    maliste.append(race)

print(maliste)

Et voici la même chose implémentée avec une compréhension de liste :


chats = ["persan", "siamois", "mandarin", "chartreux", "abyssin", "balinais"]

maliste = [race for race in chats if "in" in race]

print(maliste)

Il faut bien avouer que c'est tout de même plus élégant. Ceci étant dit, voyons comment utiliser cette syntaxe pour itérer sur les lignes d'un dataframe Pandas.

Itération sur un dataframe

Pour rappel, nous travaillons sur les mêmes données que la première partie de cette série, à savoir la base clients d'une banque. Cette base contient 41.188 lignes pour 21 colonnes.
Sur ces 21 colonnes, 11 sont de nature qualitative (situation maritale, niveau d'éducation, etc ...) et 10 sont quantitatives (âge, nombre de campagnes dont le client a fait l'objet, etc ...).
C'est précisément le nombre de campagnes (colonne "campaign") qui nous intéresse et pour l'exemple nous voulons simplement incrémenter de 1 cette variable.

Chargeons tout d'abord nos données :


import pandas as pd
bank = pd.read_csv('bank-datas.csv', sep=';',)

Nous créons une liste vide puis utilisons désormais les compréhensions de liste pour l'alimenter.


%%timeit -n 10
nb_campaign = [col + 1 for col in bank['campaign']]

Verdict : un temps moyen de 4.83 ms par itération.

Conclusion

Les performances constatées sont intéressantes. Python procède en fait à une boucle for sans que nous le sachions, néanmoins le fait de ne pas faire de append sur notre liste cible nous permet d'améliorer grandement les performances.
Il nous reste, pour être complet, à voir les vectorisations Pandas puis Numpy, ce que nous ferons dans une troisième et dernière partie.


Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !