Python Pandas – Comptage des valeurs uniques d’une Series

En Python, la librairie Pandas est incontournable pour les ingénieurs en données. Cette librairie offre un cadre simple et efficace pour transformer, manipuler et traiter les données.

Parmi les opérations usuelles, celle de compter les valeurs uniques dans une Series Pandas et de déterminer leur fréquence. La librairie Pandas offre la fonction value_counts() pour faire ce comptage de valeurs uniques dans une Series. Le comptage peut retourner le nombre de chaque valeur de façon absolue, de façon relative ou encore par intervalle. La prise en compte des valeurs Null est contrôlable ainsi que le tri par valeurs du résultats de ces comptages.

Nous allons aborder et illustrer les différentes options offertes par cette méthode dans cet article.

Cet article fait parti d’un ensemble d’article sur les utilisations avancées en Pandas.

Syntaxe générale

La syntaxe générale de la méthode value_counts() appliquée sur une Series Pandas se présente sous la forme :

Series.value_counts(normalize=False, 
                    sort=True, 
                    ascending=False, 
                    bins=None, 
                    dropna=True)

La description des paramètres est la suivante :

ParamètreDescriptionValeur par défaut
normalizeRetourne la valeur relative de chaque valeur uniqueFalse
sortTri selon la fréquence de la valeurTrue
ascendingTri selon l’ordre croissantFalse
binsCalcul la fréquence de valeur par intervalleoptionnel
dropnaPermet d’exclure les valeurs NaNTrue
Description des paramètres de la méthode value_counts()

Données Tests

Pour illustrer cette article, nous allons construire un DataFrame. Ce DataFrame est constitué des notes de 1 à 5 données pour certaines villes. Voici comment construire ce DataFrame utilisé pour montrer l’utilisation des différentes options de la méthode value_counts() :

import random
import pandas as pd

villes = ['Paris']*3 + ['New York']*5 + ['Montreal']*10 + [pd.NA]*4 + ['Milan']*1

notes = [random.randint(1, 5) for i in range(villes.size)]

df = pd.DataFrame({'Ville': villes, 'Note': notes})

Ce DataFrame est constitué de 23 lignes dont voici les 5 premières lignes :

| Ville    |   Note |
|----------|--------|
| Paris    |      4 |
| Paris    |      5 |
| Paris    |      1 |
| New York |      3 |
| New York |      2 |

Utilisation des valeurs par défaut

Dans cet exemple, nous allons compter la fréquence d’apparition de chaque élément unique dans la colonne ‘Ville’. Utilisons la méthode value_counts() sans préciser de paramètres et donc utiliser leur valeur par défauts :

print(df['Ville'].value_counts())

Le résultat de la méthode value_counts() est une Series Pandas avec comme index les éléments uniques de la Series sur laquelle la méthode a été appliquée :

Montreal    10
New York     5
Paris        3
Milan        1
dtype: int64

Ainsi en utilisant l’index, il est possible d’accéder à la fréquence d’un élément de la façon suivante :

# Fréquence de la valeur 'Montreal'
print(f"Fréquence de la ville de Montréal : {df['Ville'].value_counts()['Montreal']}")

Dans ce cas, la fréquence de la ville de « Montréal » est renvoyée :

Fréquence de la ville de Montréal : 10

Tri sur les fréquences et l’index

Il est possible de trier le résultat en utilisant les paramètres sort et ascending qui par défaut ont les valeurs True et False. Il suffit de jouer avec ces deux paramètres pour changer la façon dont le résultat sera trié. Par exemple, pour trier dans l’ordre croissant des fréquences des éléments dans la Series, il faut mettre le paramètre ascending à True de la façon suivante :

print(df['Ville'].value_counts(ascending=True))
Milan        1
Paris        3
New York     5
Montreal    10
Name: Ville, dtype: int64

Nous voyons que dorénavant les villes sont triées dans l’ordre croissant de leur fréquences.

Nous avons vu que la méthode value_counts() permet de trier le résultat du comptage sur une Series. Il est également intéressant de vouloir trier le résultat selon l’ordre de l’index du résultat de la méthode value_counts(). Pour cela, il faut appliquer la méthode sort_index() sur le résultat. Par exemple, si nous souhaitons trier le résultat par ordre croissant du nom de la ville :

print(df['Ville'].value_counts().sort_index(ascending=True))
Milan        1
Montreal    10
New York     5
Paris        3
Name: Ville, dtype: int64

Nous voyons que cette fois le résultat est bien trié selon l’ordre alphabétique croissant de l’index du résultat.

Calcul des fréquences en pourcentage

Jusqu’à présent, nous avons vu comment il est possible de calculer les fréquences de chaque élément d’une Series. Avec le paramètre normalize, il est également possible d’obtenir les fréquences en pourcentage. Pour cela, il faut mettre la valeur de ce paramètre à True comme ceci :

print(villes.value_counts(normalize=True))
Montreal    0.526316
New York    0.263158
Paris       0.157895
Milan       0.052632
Name: Ville, dtype: float64

Nous obtenons donc la proportion de chaque élément de la Series. Ainsi la ville de « Montreal » apparaît 52.6% fois dans la colonne ‘Ville’.

Gestion des valeurs manquantes

Dans la colonne ‘Ville’, il y a quatre valeurs manquantes (valeur NaN). Par défaut, la méthode value_counts() exclue les valeurs manquantes du résultat (paramètre dropna=True par défaut). Ainsi pour tenir compte de ces valeurs manquantes, il faudra modifier le paramètre dropna à False :

print(df['Ville'].value_counts(dropna=False))
Montreal    10
New York     5
<NA>         4
Paris        3
Milan        1
dtype: int64

Cette fois-ci, le résultat contient comme attendu le nombre de valeurs manquantes (<NA>) : 4 dans le cas présent.

Calcul de fréquence par intervalles

Enfin, il est possible de calculer les fréquences par intervalles en utilisant le paramètre bins pour préciser le nombre d’intervalle souhaité. L’utilisation de ce paramètre est limitée au Series numérique. Donc pour illustrer ce point, nous allons utiliser la colonne ‘Note’ et la subdiviser en cinq intervalles de la façon suivante :

print(df['Note'].value_counts(bins=5))
(1.8, 2.6]      6
(0.995, 1.8]    5
(3.4, 4.2]      5
(4.2, 5.0]      4
(2.6, 3.4]      3
Name: Note, dtype: int64

Nous avons ici les fréquences des valeurs sur les intervalles donnés en index.

Représentation graphique

Un dernier point concerne la représentation graphique des fréquences d’une Series. La libraire Pandas permet d’avoir rapidement un aperçu sous forme graphique du résultat de la méthode value_counts() en appliquant la méthode plot() sur le résultat. Voici un exemple d’une représentation sous forme de bar de la fréquence de chaque ville :

df['Ville'].value_counts().plot(kind='barh', 
                                title='Fréquence par ville') ; 
Plot des fréquences calculées avec la méthode value_counts()

Conclusion

Nous avons vu dans cet article l’ensemble des possibilités offertes par la méthode value_counts() de la librairie Pandas pour :

  • Calculer des fréquences en valeur absolue ou en pourcentage,
  • Trier par fréquence ou par valeur unique,
  • Gérer les valeurs manquantes,
  • Calculer le nombre de valeur par intervalles,
  • Représenter les résultats sous forme graphique.

Référence

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *