Fonction Pandas df.groupby()
groupby()C'est l'une des fonctions d'opération de regroupement les plus puissantes de Pandas. Elle vous permet de diviser les données en différents groupes en fonction des valeurs d'une ou plusieurs colonnes, puis d'effectuer diverses opérations sur chaque groupe.
En termes simples,groupby()il met en œuvre le"Split-Apply-Combine"(Split-Apply-Combine) workflow : d'abord fractionner les données selon des conditions, appliquer la fonction correspondante à chaque groupe, puis combiner les résultats.
C'est très courant en analyse de données, par exemple calculer le salaire moyen des employés par service, faire la somme des ventes par mois et compter les utilisateurs par région.
Syntaxe de base et paramètres
groupby()C'est une fonction membre de DataFrame, via l'opérateur point.pour l'appeler. Après l'appel, elle renvoie unGroupByobjet. Cet objet n'affiche pas directement les résultats ; il doit être utilisé conjointement avec des fonctions d'agrégation.
Format de syntaxe
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, dropna=True)
Description du paramètre
| Paramètre | Type | Description | Valeur par défaut |
|---|---|---|---|
| par | str, list ou dict | Le nom de colonne ou la liste des noms de colonnes utilisés pour le regroupement. S'il s'agit d'un dictionnaire ou d'une fonction, le regroupement est basé sur ses résultats. | Aucune |
| axis | int | La direction de l'axe pour le regroupement ; 0 signifie par ligne (par défaut), 1 signifie par colonne. | 0 |
| level | int ou str | S'il s'agit d'un MultiIndex, regrouper selon le niveau spécifié. | Aucune |
| as_index | bool | Si True, les colonnes de regroupement seront utilisées comme index du résultat renvoyé ; si False, les colonnes de regroupement seront conservées comme colonnes ordinaires. | True |
| trier | bool | Indique s'il faut trier les étiquettes de groupe. Le définir sur False peut améliorer les performances. | True |
| group_keys | bool | Lors de l'appelapply()indique s'il faut ajouter les clés de regroupement comme index dans le résultat. |
True |
| observed | bool | Si True, seules les valeurs réellement observées des variables catégorielles sont affichées, plutôt que toutes les valeurs possibles. | False |
| dropna | bool | Si True, les groupes contenant des valeurs NA/null seront supprimés. | True |
Valeur de retour
- Type de retour:
DataFrameGroupByouSeriesGroupByobjet - Description: Il renvoie un objet de regroupement, pas le résultat final. Vous devez appeler une fonction d'agrégation (telle que
sum()、mean()、count()etc.) pour obtenir le résultat de calcul spécifique.
Exemples
Maîtrisons à fond ... à travers une série d'exemples du simple au complexegroupby()l'utilisation de df.groupby().
Exemple 1 : Grouper par une seule colonne
L'utilisation la plus élémentaire consiste à regrouper par les valeurs d'une seule colonne. Supposons que nous ayons un tableau de données de ventes et que nous devions calculer le total des ventes par région.
Exemple
# Créer un DataFrame simple de données de ventes
# Simuler un tableau contenant la région, le produit et le montant des ventes
data = {
'Region': ['North', 'East', 'South', 'North', 'East', 'South', 'North', 'East'],
'Product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
'Sales': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100]
}
# Créer un DataFrame
df = pd.DataFrame(data)
print("Données d'origine :")
print(df)
print()
# Grouper par la colonne 'Region' et calculer le total des ventes pour chaque région
# as_index=True signifie que la région est renvoyée comme index
grouped = df.groupby('Region', as_index=True)['Sales'].sum()
print("Ventes totales après regroupement par région :")
print(grouped)
print()
# Lorsque as_index=False, la colonne de regroupement est conservée comme une colonne ordinaire
grouped_df = df.groupby('Region', as_index=False)['Sales'].sum()
print("Résultat lorsque as_index=False :")
print(grouped_df)
Sortie attendue :
原始数据: 地区 产品 销售额 0 华东 B 2000 1 华南 C 1500 2 华北 A 1000 3 华东 B 1800 4 华南 C 2200 5 华北 A 1600 6 华东 A 1200 7 华南 B 2100 按地区分组后的总销售额: 地区 华东 7100 华南 7300 华北 3600 dtype: int64 as_index=False 时的结果: 地区 销售额 0 华东 7100 1 华南 7300 2 华北 3600
Analyse du code :
df.groupby('地区')Les données sont divisées en trois groupes selon les valeurs de la colonne 'Region' : East, South, North.['销售额'].sum()Cela signifie que seule la colonne 'Sales' est agrégée par somme.as_index=True(valeur par défaut) renvoie une Series avec la région comme index ;as_index=FalseLorsque ..., le DataFrame renvoyé conserve la région comme une colonne ordinaire, ce qui est plus adapté au traitement ultérieur.
Exemple 2 : Regrouper par plusieurs colonnes
Il est parfois nécessaire de regrouper selon plusieurs colonnes en même temps, par exemple en regroupant par région et par produit pour calculer les ventes.
Exemple
# Créer des données de ventes
data = {
'Region': ['North', 'East', 'South', 'North', 'East', 'South', 'North', 'East'],
'Product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
'Sales': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100]
}
df = pd.DataFrame(data)
print("Données d'origine :")
print(df)
print()
# Regrouper par les colonnes 'Region' et 'Product' pour calculer les ventes totales
# Utiliser une liste pour spécifier plusieurs colonnes de regroupement
grouped = df.groupby(['Region', 'Product'], as_index=False)['Sales'].sum()
print("Ventes totales après regroupement par région et par produit :")
print(grouped)
print()
# Utiliser pivot_table pour afficher les résultats de manière plus intuitive
pivot = df.pivot_table(values='Sales', index='Region', columns='Product', aggfunc='sum', fill_value=0)
print("Affiché à l'aide de pivot_table :")
print(pivot)
Sortie attendue :
原始数据: 地区 产品 销售额 0 华北 A 1000 1 华东 B 2000 2 华南 C 1500 3 华北 B 1800 4 华东 A 2200 5 华南 C 1600 6 华北 A 1200 7 华东 B 2100 按地区和产品分组后的总销售额: 地区 产品 销售额 0 华东 A 2200 1 华东 B 4100 2 华南 C 3100 3 华北 A 2200 4 华北 B 1800 使用 pivot_table 展示: 产品 A B C 地区 华北 2200 1800 0 华东 2200 4100 0 华南 0 0 3100
Analyse du code :
['Region', 'Product']L'utilisation d'une liste permet de regrouper par plusieurs colonnes en même temps, et le résultat produit un index à plusieurs niveaux.as_index=FalseLorsque ..., les colonnes de regroupement sont conservées en tant que colonnes ordinaires dans le résultat, ce qui facilite la visualisation et le traitement ultérieur.pivot_table()Il fournit une fonction de tabulation croisée similaire, présentant les résultats de regroupement de manière plus intuitive.
Exemple 3 : Regroupement avec des dictionnaires et des fonctions
groupby()En plus du regroupement par noms de colonnes, vous pouvez également définir des règles de regroupement via des dictionnaires ou des fonctions, ce qui est très utile lorsque vous avez besoin d'une logique de regroupement personnalisée.
Exemple
# Créer des données de notes d'étudiants
data = {
'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', 'Sun Qi', 'Zhou Ba'],
'Chinois': [85, 92, 78, 88, 95, 82],
'Maths': [90, 85, 92, 78, 88, 91],
'Anglais': [88, 90, 85, 92, 87, 89]
}
df = pd.DataFrame(data)
print("Données originales de notes d'étudiants :")
print(df)
print()
# 1. Utiliser un dictionnaire pour un regroupement personnalisé
# Supposons que nous voulions regrouper par "nom de famille" (Zhang, Li, Wang comme un groupe, Zhao, Sun, Zhou comme un autre groupe)
def get_surname_group(name):
"""Renvoie le nom du groupe en fonction du nom de famille"""
if name in ['Zhang San', 'Li Si', 'Wang Wu']:
return 'Groupe 1'
else:
return 'Groupe 2'
# Utiliser la fonction apply pour le regroupement
grouped = df.groupby(get_surname_group).mean(numeric_only=True)
print("Utiliser une fonction pour définir un regroupement personnalisé (calculer le score moyen de chaque groupe) :")
print(grouped)
print()
# 2. Utiliser un dictionnaire pour mapper le regroupement pour une colonne spécifique
# Diviser les notes de chinois en groupes "Excellent" et "Bien" en fonction d'intervalles numériques
score_mapping = {
'Chinese': lambda x: 'Excellent' if x >= 90 else 'Bien'
}
# Grouper la colonne Chinese par condition
grouped_by_score = df.groupby(lambda x: 'Excellent' if df.loc[x, 'Chinese'] >= 90 else 'Bien').mean(numeric_only=True)
print("Regrouper par score Chinese (>=90 est Excellent) :")
print(grouped_by_score)
Sortie attendue :
原始学生成绩数据:
姓名 语文 数学 英语
0 张三 85 90 88
1 李四 92 85 90
2 王五 78 92 85
3 赵六 88 78 92
4 孙七 95 88 87
5 周八 82 91 89
使用函数自定义分组(计算每组平均分):
语文 数学 英语
姓名
第一组 85.000000 89.000000 87.666667
第二组 88.333333 85.666667 89.333333
按语文成绩分组(>=90为优秀):
语文 数学 英语
语文
优秀 93.500000 86.500000 88.500000
良好 83.250000 89.500000 88.750000
Analyse du code :
- Le regroupement par fonction personnalisée peut gérer une logique de regroupement complexe ; il suffit que la fonction renvoie une valeur pour le regroupement.
- Utilisation
numeric_only=Truele paramètre peut restreindre l'agrégation aux colonnes numériques, évitant les erreurs lors d'opérations sur des colonnes non numériques (telles que les noms). - Grâce à la correspondance par dictionnaire, vous pouvez mettre en œuvre l'exigence de "diviser différentes colonnes en différents groupes en fonction de conditions."
Exemple 4 : Itération sur les groupes après regroupement
Parfois, nous devons effectuer des opérations personnalisées plus complexes sur chaque groupe ; dans ce cas, nous pouvons parcourir les objets de groupe.
Exemple
# Créer des données de ventes
data = {
'Region': ['North', 'East', 'South', 'North', 'East', 'South'],
'Product': ['A', 'B', 'C', 'B', 'A', 'C'],
'Sales amount': [1000, 2000, 1500, 1800, 2200, 1600]
}
df = pd.DataFrame(data)
print("Données brutes :")
print(df)
print()
# Parcourir chaque groupe pour le traitement
print("Informations détaillées pour chaque groupe :")
print("-" * 40)
for group_name, group_data in df.groupby('Region'):
print(f"nNom du groupe : {group_name}")
print(f"Nombre de lignes dans ce groupe : {len(group_data)}")
print(f"Ventes totales pour ce groupe : {group_data['Sales amount'].sum()}")
print(f"Ventes moyennes pour ce groupe : {group_data['Sales amount'].mean():.2f}")
print("-" * 40)
Sortie attendue :
原始数据: 地区 产品 销售额 0 华东 B 2000 1 华南 C 1500 2 华北 A 1000 3 华东 B 1800 4 华南 C 2200 5 华北 B 1800 每个分组的详细信息: ---------------------------------------- 分组名称: 华东 该组数据行数: 2 该组销售总额: 3800 该组平均销售额: 1900.00 ---------------------------------------- 分组名称: 华南 该组数据行数: 2 3700 1850.00 ---------------------------------------- 分组名称: 华北 该组数据行数: 2 2800 1400.00 ----------------------------------------
Explication du code :
groupby()L'objet groupé renvoyé peut être parcouru directement ; chaque itération renvoie un tuple : (nom du groupe, données de ce groupe).- De cette façon, vous pouvez effectuer des opérations personnalisées arbitrairement complexes sur chaque groupe.
- Dans les applications pratiques, cette méthode est souvent utilisée pour générer des rapports complexes ou effectuer un nettoyage de données.
Astuce :
groupby()L'objet GroupBy retourné est "exécuté paresseusement" et ne calcule pas les résultats immédiatement. Ce n'est que lors de l'appel de fonctions d'agrégation (telles quesum()、mean()、count()etc.) ou en itérant que le calcul réel sera effectué.
Autres extensions