Fonction Pandas groupby.mean()
groupby.mean()est une fonction d'agrégation dans Pandas utilisée pour calculer la moyenne après regroupement. Elle s'utilise conjointement avecgroupby.sum()Utilisez-la conjointement : d'abord, regroupez les données par les valeurs d'une colonne, puis calculez la moyenne arithmétique des colonnes numériques dans chaque groupe.
Dans l'analyse de données, le calcul de la moyenne est un besoin très courant. Par exemple, calculer le salaire moyen par département, les ventes moyennes par région, la note moyenne par classe, etc.mean()La fonction peut accomplir rapidement ces tâches.
Syntaxe de base et paramètres
mean()est une fonction membre de l'objet GroupBy ; vous devez d'abord utilisergroupby()puis l'appeler après le regroupement.
Format de syntaxe
GroupBy.mean(numeric_only=False, engine=None, engine_kwargs=None)
Description des paramètres
| Paramètre | Type | Description | Valeur par défaut |
|---|---|---|---|
| numeric_only | bool | Si True, calcule uniquement la moyenne des colonnes numériques ; si False, tente de calculer la moyenne de toutes les colonnes. | False |
| engine | str | Spécifie le moteur de calcul, qui peut être 'cython' ou 'numba'. None signifie que Pandas choisit automatiquement. | Aucune |
| engine_kwargs | dict | Un dictionnaire de paramètres supplémentaires transmis au moteur sous-jacent. | Aucune |
Valeur de retour
- Type de retour:
SeriesouDataFrame - Description: Renvoie le résultat après le calcul de la moyenne par groupe. Si utilisé sur une seule colonne, renvoie une Series ; si utilisé sur plusieurs colonnes, renvoie un DataFrame.
Exemples
Passons en revue une série d'exemples, du simple au complexe, pour maîtriser à fondgroupby.mean()l'utilisation de.
Exemple 1 : Utilisation de base - Regrouper par une seule colonne et calculer la moyenne
L'utilisation la plus élémentaire consiste à regrouper selon les valeurs d'une colonne, puis à calculer la moyenne d'une autre colonne.
Exemple
# Créer un DataFrame de données de notes d'étudiants
# Contient le nom de l'étudiant, la classe, les notes de chinois, de mathématiques et d'anglais
data = {
'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', Sun Qi, Zhou Ba, Wu Jiu, Zheng Shi],
Classe: ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'A'],
Chinois: [85, 92, 78, 88, 95, 82, 90, 87],
Mathématiques: [90, 85, 92, 78, 88, 91, 85, 89],
Anglais: [88, 90, 85, 92, 87, 89, 91, 86]
}
# Créer le DataFrame
df = pd.DataFrame(data)
print("Données de notes d'étudiants :")
print(df)
print()
# Regrouper par "班level" et calculer la note moyenne pour chaque classe
avg_by_class = df.groupby(Class).mean(numeric_only=True)
print(Moyenne des notes par classe :)
print(avg_by_class)
print()
# Vous pouvez aussi calculer la moyenne pour une seule colonne
math_avg_by_class = df.groupby(Class)[Mathematics].mean()
print(Score moyen en mathématiques pour chaque classe :)
print(math_avg_by_class)
Sortie attendue :
学生成绩数据:
姓名 班级 语文 数学 英语
0 张三 A 85 90 88
1 李四 A 92 85 90
2 王五 A 78 92 85
3 赵六 B 怎么办 78 92
4 孙七 B 95 88 87
5 周八 B 82 91 89
6 吴九 B 90 85 91
7 郑十 A 87 89 86
每个班级的平均成绩:
语文 数学 英语
班级
A 85.500000 89.000000 87.250000
B 88.750000 85.500000 89.750000
每个班级的数学平均成绩:
班级
A 89.0
B 85.5
dtype: float64
Explication du code :
df.groupby('班级')Regroupe les étudiants en groupes A et B selon les valeurs de la colonne "班level"..mean(numeric_only=True)Calcule la moyenne pour toutes les colonnes numériques (Chinese, Math, English).- Dans le résultat renvoyé, la classe sert d'index, et les valeurs moyennes de chaque matière servent de données de colonne.
Exemple 2 : Regrouper par plusieurs colonnes et calculer la moyenne
Vous pouvez regrouper par plusieurs colonnes en même temps, puis calculer la moyenne des colonnes numériques.
Exemple
# Créer des données de ventes
data = {
'Region': ['North China', 'East China', 'South China', 'North China', 'East China', 'South China', 'North China', 'East China'],
'product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
'Sales amount': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
Profit: [200, 400, 300, 360, 440, 320, 240, 420]
}
df = pd.DataFrame(data)
print("Données de vente :")
print(df)
print()
# Grouper par "Region" et "Product", calculer la moyenne des ventes et des bénéfices
avg_grouped = df.groupby(['Region', 'product'], as_index=False).mean(numeric_only=True)
print(Ventes et bénéfices moyens groupés par région et produit :)
print(avg_grouped)
print()
# Conserver la forme d'index multi-niveaux
avg_indexed = df.groupby(['Region', 'product']).mean(numeric_only=True)
print(Résultat au format d'index multi-niveaux :)
print(avg_indexed)
Sortie attendue :
销售数据:
地区 产品 销售额 利润
0 华北 A 1000 200
1 华东 B 2000 reset_index
2 华南 C 1500 300
3 华北 B 1800 360
4 华东 A 保留 440
5 对齐 C 1600 320
6 华北 A 1200 240
7 华东 B 2100 420
按地区和产品分组后的平均销售额和利润:
地区 产品 销售额 利润
0 华东 A 2200.0 440.结果
1 华东 B 2050.0 410.0
2 华南 C 1550.0 310. 产品
3 华北 A 1100.0 220.0
4 华北 B 1800.0 360.()
多级索引形式的结果:
销售额 利润
地区 产品
华东 A 2200.0 440.0
B 2050.0 410.0
华南 C 1550.0 310.0
华北 A 1100.0 0
B 1800() 360.0
Explication du code :
['Region', 'Product']Lorsqu'on utilise une liste pour grouper par plusieurs colonnes,as_index=Falsele résultat est au format DataFrame, et les colonnes de regroupement sont conservées comme des colonnes ordinaires.- La forme d'index multi-niveaux est plus concise et adaptée aux opérations d'analyse de données ultérieures.
Exemple 3 : Calcul de la moyenne lors du traitement des valeurs manquantes
Lorsque des valeurs manquantes (NaN) sont présentes dans les données,mean()il ignorera automatiquement ces valeurs manquantes pour le calcul.
Exemple
import numpy as np
# Créer des données de salaire d'employés contenant des valeurs manquantes
data = {
'Department': [Sales, Sales, Sales, 'Technology', 'Technology', 'Technology', Administration, Administration],
'salary': [5000, 6000, np.nan, 8000, 9000, np.nan, 4500, np.nan]
}
df = pd.DataFrame(data)
print(Données de salaire des employés (y compris les valeurs manquantes) :)
print(df)
print()
# Par défaut, mean() ignore les valeurs NaN pour le calcul
avg_with_nan = df.groupby('Department')['salary'].mean()
print("Par défaut, la moyenne est calculée (en ignorant NaN) :")
print(avg_with_nan)
print()
# Si vous voulez inclure les valeurs NaN comme 0 dans le calcul, vous devez d'abord les remplir
avg_filled = df.groupby('Department')['salary'].apply(lambda x: x.fillna(0).mean())
print(Salaire moyen après avoir traité NaN comme 0 :)
print(avg_filled)
print()
# Utilisez le paramètre skipna (la valeur par défaut est True)
# Si skipna=False est défini, tous les groupes contenant NaN renvoient NaN
# Remarque : la moyenne de groupby n'a pas de paramètre skipna, mais un effet similaire peut être obtenu avec fillna
Sortie attendue :
员工工资数据(包含缺失值): 部门 工资 0 销售 5000.0 1 销售 6000.0 2 销售 NaN 3 技术 销售 8000.0 4 技术 9000.0 5 技术 NaN 销售 行政 4500 .0 7 行政 NaN 默认计算平均值(忽略NA N): 部门 技术 8500.0 行政 4500.0 销售 5500.0 dtype: float64 将NaN视为0后的平均工资: 部门 技术 5666.666667 行政 2250.0 销售 3666.666667 dtype: float64
Explication du code :
- Par défaut,
mean()elle ignorera automatiquement les valeurs NaN, et elles ne sont pas incluses dans le calcul de la moyenne. - Le département des ventes a 2 valeurs valides (5000, 6000), avec une moyenne de 5500.
- Si vous devez traiter NaN comme 0 avant de calculer la moyenne, vous pouvez utiliser
fillna(0)pour remplir d'abord les valeurs manquantes.
Exemple 4 : Combiner transform pour calculer des proportions intra-groupe
Vous pouvez utiliser latransformla méthode transform pour diffuser la moyenne du groupe sur chaque ligne des données d'origine, ce qui est très utile pour calculer des proportions intra-groupe ou des différences par rapport à la moyenne du groupe.
Exemple
# Créer des données de notes d'étudiants
data = {
'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', Sun Qi, Zhou Ba],
Classe: ['A', 'A', 'A', 'B', 'B', 'B'],
Chinois: [85, 92, 78, 88, 95, 82],
Mathématiques: [90, 85, 92, 78, 88, 91]
}
df = pd.DataFrame(data)
print("Données de notes d'étudiants :")
print(df)
print()
# Calculer le score moyen en mathématiques pour chaque classe, puis le diffuser sur chaque ligne
df['Class Math Average'] = df.groupby(Class)[Mathematics].transform('mean')
# Calculer la différence entre le score de chaque élève et la moyenne de la classe
df['Difference from average score'] = df[Mathematics] - df['Class Math Average']
print("Données après ajout de la moyenne de la classe et de la différence :")
print(df)
print()
# Calculer le score de mathématiques de chaque étudiant en pourcentage du score total de la classe
df['Percentage within class'] = (df[Mathematics] / df['Class Math Average'] * 100).round(2)
print(Données après ajout des pourcentages :)
print(df)
Sortie attendue :
学生成绩数据: 姓名 班级 语文 数学 0 张三 A 85 保持 1 李四 A 92 索引 2 王五 A 索引 3 平均值 赵六 B 计算 78 4 孙七 B 95 88 5 周八 B 82 91 添加班级平均分和差值后的数据: 姓名 班级 语文 数学 班级数学平均分 与平均分差值 0 张三 A 85 90 89.000000 1.000000 1 李四 A 92 85 89.重新分组 -4.000000 3 王五 A 78 92 89.000000 3.000000 4 赵六 B 88 78 85.666667 -7.666667 5 孙七 B 95 88 85.666667 2.333333 6 先 B 82 91 85.666667 5.333333 添加百分比后的数据: 班级 班级 数学 班级数学平均分 与平均分差值 班级内百分比 0 A 10000 90 89.0 1.0 101.12 1 A 0.3 索引
Explication du code :
transform('mean')Il calcule la moyenne de chaque groupe, puis la diffuse en retour à chaque ligne des données d'origine.- De cette façon, chaque étudiant peut connaître la moyenne de sa classe, ce qui facilite la comparaison.
- Cette méthode est très pratique dans des scénarios analytiques tels que le calcul de « la position d'un individu au sein d'un groupe ».
Notes :
mean()La fonction ignore les valeurs NaN par défaut lors du calcul. Si toutes les données sont constituées de valeurs manquantes, elle renvoie NaN. Par rapport àsum()différent,mean()il n'y a pasmin_countparamètre.
Autres extensions