Pandas : une formule simple pour « regrouper par avoir »
Vous pouvez utiliser la syntaxe de base suivante pour exécuter l’équivalent d’une instruction SQL « GROUP BY HAVING » dans les pandas :
df.groupby('some_column').filter(lambda x: some condition)
Les exemples suivants montrent comment utiliser cette syntaxe en pratique avec le DataFrame pandas suivant :
import pandas as pd #create DataFrame df = pd.DataFrame({'team': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'], 'position': ['G', 'F', 'F', 'G', 'F', 'F', 'G', 'G'], 'points': [30, 22, 19, 14, 14, 11, 20, 28]}) #view DataFrame print(df) team position points 0 A G 30 1 A F 22 2 A F 19 3 B G 14 4 B F 14 5 B F 11 6 C G 20 7 C G 28
Exemple 1 : Groupe de pandas en ayant avec Count
Le code suivant montre comment regrouper les lignes en fonction de la valeur dans la colonne d’équipe , puis filtrer uniquement les équipes dont le nombre est supérieur à 2 :
#group by team and filter for teams with count > 2
df.groupby('team').filter(lambda x: len(x) > 2)
team position points
0 A G 30
1 A F 22
2 A F 19
3 B G 14
4 B F 14
5 B F 11
Notez que seules les lignes avec une valeur d’équipe de « A » ou « B » sont renvoyées puisqu’il s’agit des deux équipes dont le nombre est supérieur à 2.
Exemple 2 : Groupe de pandas en ayant avec moyenne
Le code suivant montre comment regrouper les lignes en fonction de la valeur dans la colonne d’équipe , puis filtrer uniquement les équipes dont la valeur moyenne de points est supérieure à 20 :
#group by team and filter for teams with mean points > 20
df.groupby('team').filter(lambda x: x['points'].mean() > 20)
team position points
0 A G 30
1 A F 22
2 A F 19
6 C G 20
7 C G 28
Notez que seules les lignes avec une valeur d’équipe de « A » ou « C » sont renvoyées puisqu’il s’agit des deux équipes qui ont une valeur moyenne de points supérieure à 20.
Exemple 3 : Groupe de pandas en ayant avec somme
Le code suivant montre comment regrouper les lignes par valeur dans la colonne équipe , puis filtrer uniquement les équipes dont la somme de points est exactement égale à 48 :
#group by team and filter for teams with sum of points equal to 48
df.groupby('team').filter(lambda x: x['points'].sum() == 48)
team position points
6 C G 20
7 C G 28
Notez que seules les lignes avec une valeur d’équipe de « C » sont renvoyées puisqu’il s’agit de la seule équipe qui a une somme de points égale à 48.
Ressources additionnelles
Les didacticiels suivants expliquent comment effectuer d’autres opérations courantes dans les pandas :
Pandas : obtenir l’index des lignes dont la colonne correspond à la valeur
Pandas : comment sélectionner des colonnes contenant une chaîne spécifique
Pandas : comment vérifier si la colonne contient une chaîne