Fonction Pandas df.groupby()

Fonctions courantes de Pandas


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 quesum()、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

import pandas as pd

# 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 :

  1. df.groupby('地区')Les données sont divisées en trois groupes selon les valeurs de la colonne 'Region' : East, South, North.
  2. ['销售额'].sum()Cela signifie que seule la colonne 'Sales' est agrégée par somme.
  3. 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

import pandas as pd

# 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

import pandas as pd

# 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.
  • Utilisationnumeric_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

import pandas as pd

# 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é.


Fonctions Pandas courantes

Autres extensions