Introduction aux opérations Groupby et Aggregate pour l'analyse exploratoire des données avec pandas.
Table des matières
- Introduction
- Test sur la base de données Titanic
- E.D.A
- Group by sur les colonnes 'Survived' et 'Sex' puis obtenir la moyenne sur 'Age' et 'Fare':
- Group by sur les colonnes 'Survived' et 'Sex' puis obtenir l'Age moyen:
- Calculer la probabilité de survivre par class (approche rapide):
- Calculer la probabilité de survivre par class (approche lente):
- Group by sur les colonnes 'Survived' et 'Sex' puis appliquerdescribe() sur age
- Group by sur les colonnes 'Survived' et 'Sex' puis appliquer aggregate (mean, max, min) sur age et fate
- Group by sur la colonne Survived et obtenir l "age" moyen
- Group by sur la colonne Survived et obtenir le "fare" moyen
- Références
Note: vous pouvez aussi télécharger mon jupyter notebook
que j'ai créé pour tester Groupby et Aggregate avec pandas en python.
Introduction
Importer pandas
import pandas as pd
GroupBy
Comment créer une dataframe avec pandas
Créons d'abord une dataframe pour l'exemple:
data = {'Age':[21,26,82,15,28],'weight':[120,148,139,156,129],'Gender':['male','male','female','male','female'],'Country':['France','USA','USA','Germany','USA']}df = pd.DataFrame(data=data)
donne
Age weight Gender Country0 21 120 male France1 26 148 male USA2 82 139 female USA3 15 156 male Germany4 28 129 female USA
Comment utiliser group by
Pour regrouper par "Sexe" par exemple, une solution est d'utiliser pandas.DataFrame.groupby
df.groupby(by="Gender").mean()
donne ici
Age weightGenderfemale 55.000000 134.000000male 20.666667 141.333333
Comment utiliser group by avec 2 colonnes
Pour regrouper par genre et pays :
df.groupby(["Gender",'Country']).mean()
donne
Age weightGender Countryfemale USA 55 134male France 21 120Germany 15 156USA 26 148
Notez que l'inversion de l'ordre des colonnes n'a aucun impact ici :
df.groupby(["Country",'Gender']).mean()print(df.groupby(["Country",'Gender']).mean())
donne
Age weightCountry GenderFrance male 21 120Germany male 15 156USA female 55 134male 26 148
How to only apply group for a specific column
Comment regrouper UNIQUEMENT par sexe et pays pour une colonne spécifique "Âge" par exemple (la sélection des colonnes à appliquer au regroupement devrait être plus rapide si la base de données a beaucoup de colonnes)
df.groupby(["Gender",'Country']).Age.mean()
donne
Gender Countryfemale USA 55male France 21Germany 15USA 26Name: Age, dtype: int64
Idem que
df.groupby(["Gender",'Country'])['Age'].mean()
donne aussi
Gender Countryfemale USA 55male France 21Germany 15USA 26Name: Age, dtype: int64
Comment trier les valeurs d'une colonne donnée après avoir appliqué le group by :
df.groupby(["Country",'Gender']).mean().sort_values(by='Age')print(df.groupby(["Country",'Gender']).mean().sort_values(by='Age'))
donne
Age weightCountry GenderGermany male 15 156France male 21 120USA male 26 148female 55 134
Comment utiliser describe() avec group by
df.groupby(by="Gender").describe()
donne
Age weightcount mean std min 25% 50% 75% max count mean std min 25% 50% 75% maxGenderfemale 2.0 55.000000 38.183766 28.0 41.5 55.0 68.5 82.0 2.0 134.000000 7.071068 129.0 131.5 134.0 136.5 139.0male 3.0 20.666667 5.507571 15.0 18.0 21.0 23.5 26.0 3.0 141.333333 18.903263 120.0 134.0 148.0 152.0 156.0
Comment combiner groupby et aggregate
df.groupby(by="Gender").agg('mean')print(df.groupby(by="Gender").agg('mean'))Age weightGenderfemale 55.000000 134.000000male 20.666667 141.333333
Avantage : possibilité de définir plusieurs types d'agrégation (moyenne, comptage, etc.)
df.groupby(by="Gender").agg(['mean','count','sum','min','max'])print(df.groupby(by="Gender").agg(['mean','count','sum','min','max']))Age weightmean count sum min max mean count sum min maxGenderfemale 55.000000 2 110 28 82 134.000000 2 268 129 139male 20.666667 3 62 15 26 141.333333 3 424 120 156
Test sur la base de données Titanic
Testons maintenant ce que nous avons appris précédemment sur le jeu de données Titanic :
df = pd.read_csv('https://raw.githubusercontent.com/benjamin-hg-marchant/teaching/main/datasets/titanic.csv')df.head()
donne
PassengerId Survived Pclass \0 1 0 31 2 1 12 3 1 33 4 1 14 5 0 3Name Sex Age SibSp \0 Braund, Mr. Owen Harris male 22.0 11 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 12 Heikkinen, Miss. Laina female 26.0 03 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 14 Allen, Mr. William Henry male 35.0 0Parch Ticket Fare Cabin Embarked0 0 A/5 21171 7.2500 NaN S1 0 PC 17599 71.2833 C85 C2 0 STON/O2. 3101282 7.9250 NaN S3 0 113803 53.1000 C123 S4 0 373450 8.0500 NaN S
E.D.A
Obtenez les noms de colonnes :
df.columns
donne
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp','Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],dtype='object')
Répartition par âge
df['Age'].plot(kind="hist")

df['Age'].mean()
donne
29.69911764705882
Obtenir value_counts()
df['Sex'].value_counts(dropna=False)
donne ici
male 577female 314Name: Sex, dtype: int64
Obtenez l'âge moyen pour les hommes
df['Age'][ df['Sex'] == "male" ].mean()df['Age'][ df['Sex'] == "male" ].hist()
donne
30.72664459161148
er

Obtenez l'âge moyen pour les femmes
df['Age'][ df['Sex'] == "female" ].mean()df['Age'][ df['Sex'] == "female" ].hist()
donne
27.915708812260537
et

Group by sur les colonnes 'Survived' et 'Sex' puis obtenir la moyenne sur 'Age' et 'Fare':
df.groupby(['Survived','Sex'])[['Age','Fare']].mean()
donne
Age FareSurvived Sex0 female 25.046875 23.024385male 31.618056 21.9609931 female 28.847716 51.938573male 27.276022 40.821484
Group by sur les colonnes 'Survived' et 'Sex' puis obtenir l'Age moyen:
df.groupby(['Survived','Sex']).Age.mean()
donne
Survived Sex0 female 25.046875male 31.6180561 female 28.847716male 27.276022Name: Age, dtype: float64
Calculer la probabilité de survivre par class (approche rapide):
df[['Pclass','Survived']].groupby(['Pclass']).mean()
donne
SurvivedPclass1 0.6296302 0.4728263 0.242363
Calculer la probabilité de survivre par class (approche lente):
df.groupby(['Pclass'])[['Survived']].mean()
donne
SurvivedPclass1 0.6296302 0.4728263 0.242363
Group by sur les colonnes 'Survived' et 'Sex' puis appliquerdescribe() sur age
df.groupby(['Survived','Sex']).Age.describe()
donne
count mean std min 25% 50% 75% maxSurvived Sex0 female 64.0 25.046875 13.618591 2.00 16.75 24.5 33.25 57.0male 360.0 31.618056 14.056019 1.00 21.75 29.0 39.25 74.01 female 197.0 28.847716 14.175073 0.75 19.00 28.0 38.00 63.0male 93.0 27.276022 16.504803 0.42 18.00 28.0 36.00 80.0
Group by sur les colonnes 'Survived' et 'Sex' puis appliquer aggregate (mean, max, min) sur age et fate
df.groupby(['Survived','Sex'])[['Age','Fare']].agg(['mean','max','min'])
donne
Age Faremean max min mean max minSurvived Sex0 female 25.046875 57.0 2.00 23.024385 151.5500 6.750male 31.618056 74.0 1.00 21.960993 263.0000 0.0001 female 28.847716 63.0 0.75 51.938573 512.3292 7.225male 27.276022 80.0 0.42 40.821484 512.3292 0.000
Group by sur la colonne Survived et obtenir l "age" moyen
df.groupby(['Survived']).Age.mean()
donne
Survived0 30.6261791 28.343690
Group by sur la colonne Survived et obtenir le "fare" moyen
df.groupby(['Survived']).Fare.mean()
donne
Survived0 22.1178871 48.395408Name: Fare, dtype: float64
