3 Fonctions Pandas A Connaitre

La Data Science étant un domaine très vaste, il est impossible de maîtriser tous les langages et toutes les bibliothèques – et même après avoir travaillé 10 ans dans ce domaine, mes connaissances sont limitées. L’apprentissage constant c’est ce qui me maintient dans le game, et après réflexion, connaître les fonctions de cet article aurait été un énorme gain de temps dès le début. Alors si je peux te faire gagner ce temps précieux, j’en serai ravi !

Certaines d’entre elles sont purement fonctionnelles, mais d’autres, en revanche, font référence à la façon dont on utilise Pandas, et la raison pour laquelle une approche est meilleure qu’une autre.

Commençons donc par la première – elle pourrait te surprendre par son efficacité.

itertuples()

Euh…attends, quoi ? Oui, il ne s’agit pas d’une fonction à proprement parler, mais de la manière la plus efficace d’utiliser Pandas, c’est-à-dire la manière la plus rapide d’itérer à travers un ensemble de données.

Alors, je sais qu’il y a des moyens plus efficaces pour additionner les valeurs des colonnes, mais je le fais de cette façon juste pour faire valoir mon point de vue.

Nous allons déclarer un jeu de données simple avec une seule colonne, contenant une plage de nombres de 1 à 1 million. Voici comment procéder :

df = pd.DataFrame(data={'Nombre': range(1, 1000000)})

Voici à quoi ressemblent les 5 premières lignes :

Df Generation De Nombres

Maintenant, faisons les choses de la mauvaise manière. Nous allons déclarer une variable total et la fixer à 0. Ensuite, en utilisant iterrows(), nous allons itérer sur l’ensemble de données et incrémenter le résultat de la variable total de la valeur de la ligne actuelle. Nous allons également mesurer la durée d’exécution (sur Google Colab).
Voici le code :

%%time
total = 0
for _, row in df.iterrows():
    total += row['Nombre']
 
total

>>> Wall time: 41.1 s

Plus de 41 secondes pour cette opération triviale – mais il y a une meilleure façon de procéder. Faisons la même chose, mais avec iteruples au lieu de iterrows :

%%time
total = 0
for row in df.itertuples(index=False):
    total += row.Nombre
 
total

>>> Wall time: 533 ms

Je ne ferai pas les calculs, mais l’amélioration de la vitesse est significative. Ne l’oublie pas la prochaine fois que tu exécuteras une boucle !

nlargest() et nsmallest()

Hier encore, je calculais une distance en kilomètres à partir de deux paires latitude/longitude. C’était la première partie du problème – la seconde consistait à sélectionner les N premiers enregistrements avec la plus petite distance.

C’est là qu’intervient la fonction nsmallest().

Comme son nom l’indique, nlargest() renvoie les N plus grandes valeurs, et nsmallest() fait exactement l’inverse.

Voyons cela en action. Pour la partie pratique, j’ai préparé un petit ensemble de données :

df = pd.DataFrame(data={
    'Nom': ['Bob', 'Marc', 'Jon', 'Anna', 'Elio', 'Dexter'],
    'Points': [37, 91, 66, 42, 99, 81]
})

Et voici à quoi cela ressemble :

Df Noms Et Points

Supposons maintenant que cet ensemble de données ne contienne plus 6 lignes mais 6000, et que l’on souhaite déterminer quels sont les élèves qui ont obtenu les meilleurs résultats, c’est-à-dire qui ont obtenu le plus grand nombre de points. Une façon de procéder serait la suivante :

df['Points'].nlargest(3)

Cette solution n’est pas optimale, car elle aboutirait à ce résultat :

4    99
1    91
5    81
Name: Points, dtype: int64

Ce n’est pas une bonne chose car tu n’as pas une image claire des noms réels. Voici comment améliorer la solution :

df.nlargest(3, columns='Points')

Maintenant, les résultats sont beaucoup plus satisfaisants :

Resultat Df Nlargest

Tu peux mettre en œuvre presque la même logique pour trouver les 3 élèves qui ont obtenu les moins bons résultats – avec la fonction nsmallest() :

df.nsmallest(3, columns='Points')

Voici le résultat :

Resultat Df Nsmallest

Passons maintenant à la dernière fonction.

cut()

Pour démontrer les capacités de cette fonction, nous utiliserons l’ensemble de données de la section précédente.

L’idée de base de la fonction cut() est de diviser les valeurs en intervalles discrets. Voici l’exemple le plus simple : nous allons créer deux intervalles à partir de l’attribut Points :

pd.cut(df['Points'], bins=2)
0    (36.938, 68.0]
1      (68.0, 99.0]
2    (36.938, 68.0]
3    (36.938, 68.0]
4      (68.0, 99.0]
5      (68.0, 99.0]
Name: Points, dtype: category
Categories (2, interval[float64, right]): [(36.938, 68.0] < (68.0, 99.0]]

Ce n’est pas très utile pour l’instant. Mais pourquoi ne pas déclarer que le premier intervalle va de 0 à 50, et le second de 50 à 100 ? Cela semble être un bon plan.
Voici le code :

pd.cut(df['Points'], bins=[0, 50, 100])
0      (0, 50]
1    (50, 100]
2    (50, 100]
3      (0, 50]
4    (50, 100]
5    (50, 100]
Name: Points, dtype: category
Categories (2, interval[int64, right]): [(0, 50] < (50, 100]]

Mais imaginons que vous souhaitiez afficher Échec au lieu de (0, 50) et Réussite au lieu de (50, 100).
Voici comment procéder :

pd.cut(df['Points'], bins=[0, 50, 100], labels=['Échec', 'Réusite'])
0      Échec
1    Réusite
2    Réusite
3      Échec
4    Réusite
5    Réusite
Name: Points, dtype: category
Categories (2, object): ['Échec' < 'Réusite']

Maintenant, ça ressemble à quelque chose !!

Avant de se quitter…

Si tu débutes en Python, ces fonctions t’aideront à gagner du temps. Si tu n’es plus débutant, la lecture de cet article t’aidera à renforcer la connaissance (de l’existence) de ces fonctions – parce qu’il est facile de les oublier et d’écrire la logique à partir de zéro (ce qui ne sert à rien).

J’espère que l’article t’a plu. Merci de ta lecture 🙂

Publications similaires

0 Commentaires
Le plus récent
Le plus ancien Le plus populaire
Commentaires en ligne
Afficher tous les commentaires