Dans pandas, la mรฉthode ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() permet de regrouper les donnรฉes dans D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ et S๐โ๐ซโ๐ขโ๐โ๐ฌโ .
Cette mรฉthode permet d’agrรฉger des donnรฉes par groupe pour calculer des mesures statistiques telles que des moyennes, des minimums, des maximums et des totaux, ou pour appliquer des fonctions.
- Grouper par : split-apply-combine โ documentation pandas 2.1.3
- GroupBy โ Documentation pandas 2.1.3
- Utilisation de base de ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ()
- Grouper par plusieurs colonnes
- Spรฉcifiez si vous souhaitez utiliser les noms de colonnes comme index : ๐โ๐ฌโ_๐ขโ๐งโ๐โ๐โ๐ฑโ
- Gรฉrer les valeurs manquantes N๐โN : ๐โ๐ซโ๐จโ๐ฉโ๐งโ๐โ
- Obtention des donnรฉes dans chaque groupe : ๐ โ๐โ๐ญโ_๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ()
- Appliquer plusieurs processus : ๐โ๐ โ๐ โ()
- Calculer plusieurs statistiques : ๐โ๐โ๐ฌโ๐โ๐ซโ๐ขโ๐โ๐โ()
- Appliquez n’importe quelle fonction ร chaque groupe : ๐โ๐ฉโ๐ฉโ๐ฅโ๐ฒโ()
La version pandas utilisรฉe dans cet article est la suivante. Notez que les fonctionnalitรฉs peuvent varier selon les versions. Le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ suivant est utilisรฉ comme exemple.
import pandas as pd print(pd.__version__) # 2.1.2 df = pd.DataFrame( {'c_0': ['A', 'A', 'B', 'B', 'B', 'B'], 'c_1': ['X', 'Y', 'X', 'Y', 'X', 'Y'], 'c_2': [0, 1, 4, 9, 16, 25], 'c_3': [125, 64, 27, 16, 1, 0]}, index=['r_0', 'r_1', 'r_2', 'r_3', 'r_4', 'r_5'] ) print(df) # c_0 c_1 c_2 c_3 # r_0 A X 0 125 # r_1 A Y 1 64 # r_2 B X 4 27 # r_3 B Y 9 16 # r_4 B X 16 1 # r_5 B Y 25 0
Utilisation de base de ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ()
Vous pouvez regrouper des donnรฉes ร l’aide de la mรฉthode ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() , qui est fournie dans D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ et S๐โ๐ซโ๐ขโ๐โ๐ฌโ .
- pandas.DataFrame.groupby โ documentation de pandas 2.1.3
- pandas.Series.groupby โ documentation de pandas 2.1.3
Lorsque vous spรฉcifiez des noms de colonne dans le premier argument, ๐โ๐ฒโ , les donnรฉes sont regroupรฉes selon les valeurs de cette colonne. Un objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ est renvoyรฉ, qui n’affiche pas son contenu lors de l’impression.
grouped = df.groupby('c_0') print(grouped) # <pandas.core.groupby.generic.DataFrameGroupBy object at 0x1272139d0> print(type(grouped)) # <class 'pandas.core.groupby.generic.DataFrameGroupBy'>
Vous pouvez traiter chaque groupe en exรฉcutant des mรฉthodes sur l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ .
Par exemple, la mรฉthode ๐ฆโ๐โ๐โ๐งโ() calcule la moyenne de chaque groupe. Si l’argument ๐งโ๐ฎโ๐ฆโ๐โ๐ซโ๐ขโ๐โ_๐จโ๐งโ๐ฅโ๐ฒโ est dรฉfini sur T๐ซโ๐ฎโ๐โ , les colonnes non numรฉriques sont ignore. Une valeur D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ est renvoyรฉe.
df_mean = grouped.mean(numeric_only=True) print(df_mean) # c_2 c_3 # c_0 # A 0.5 94.5 # B 13.5 11.0 print(type(df_mean)) # <class 'pandas.core.frame.DataFrame'>
Il est รฉgalement possible d’รฉcrire ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() et ses mรฉthodes successivement.
print(df.groupby('c_0').mean(numeric_only=True)) # c_2 c_3 # c_0 # A 0.5 94.5 # B 13.5 11.0 print(df.groupby('c_1').mean(numeric_only=True)) # c_2 c_3 # c_1 # X 6.666667 51.000000 # Y 11.666667 26.666667
L’application de [๐โ๐จโ๐ฅโ๐ฎโ๐ฆโ๐งโ_๐งโ๐โ๐ฆโ๐โ] ou [๐ฅโ๐ขโ๐ฌโ๐ญโ_๐จโ๐โ_๐โ๐จโ ๐ฅโ๐ฎโ๐ฆโ๐งโ_๐งโ๐โ๐ฆโ๐โ๐ฌโ] ร l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ cible uniquement celles des colonnes ร traiter. Ceci est utile lorsqu’il ya des colonnes inutiles.
print(df.groupby('c_0')['c_2'].mean()) # c_0 # A 0.5 # B 13.5 # Name: c_2, dtype: float64 print(df.groupby('c_0')[['c_2', 'c_3']].mean()) # c_2 c_3 # c_0 # A 0.5 94.5 # B 13.5 11.0
En plus de ๐ฆโ๐โ๐โ๐งโ() , il existe diffรฉrentes mรฉthodes telles que ๐ฌโ๐ฎโ๐ฆโ() pour calculer les totaux et ๐โ๐จโ๐ฎโ๐งโ๐ญโ() pour compter les valeurs non manquantes.
print(df.groupby('c_0').sum(numeric_only=True)) # c_2 c_3 # c_0 # A 1 189 # B 54 44 print(df.groupby('c_0').count()) # c_1 c_2 c_3 # c_0 # A 2 2 2 # B 4 4 4
Pour une liste des mรฉthodes disponibles, reportez-vous ร la documentation officielle.
La mรฉthode ๐โ๐ โ๐ โ() pour appliquer plusieurs processus, ๐โ๐โ๐ฌโ๐โ๐ซโ๐ขโ๐โ๐โ() pour calculer plusieurs statistiques ร la fois et ๐โ๐ฉโ๐ฉโ๐ฅโ๐ฒโ() pour appliquer n’importe quelle fonction ร chaque groupe sont dรฉcrites plus loin.
Grouper par plusieurs colonnes
Lorsqu’une liste de noms de colonnes est spรฉcifiรฉe comme premier argument dans ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() , le regroupement peut รชtre effectuรฉ ร l’aide de plusieurs colonnes.
print(df.groupby(['c_0', 'c_1']).mean()) # c_2 c_3 # c_0 c_1 # A X 0.0 125.0 # Y 1.0 64.0 # B X 10.0 14.0 # Y 17.0 8.0
Un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ multi-index est renvoyรฉ.
Spรฉcifiez si vous souhaitez utiliser les noms de colonnes comme index : ๐โ๐ฌโ_๐ขโ๐งโ๐โ๐โ๐ฑโ
Par dรฉfaut, les noms de colonnes spรฉcifiรฉs comme premier argument dans ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() deviennent les ๐ขโ๐งโ๐โ๐โ๐ฑโ du rรฉsultat . La dรฉfinition de l’argument ๐โ๐ฌโ_๐ขโ๐งโ๐โ๐โ๐ฑโ sur F๐โ๐ฅโ๐ฌโ๐โ empรชche cela.
print(df.groupby('c_0', as_index=False).mean(numeric_only=True)) # c_0 c_2 c_3 # 0 A 0.5 94.5 # 1 B 13.5 11.0 print(df.groupby(['c_0', 'c_1'], as_index=False).mean()) # c_0 c_1 c_2 c_3 # 0 A X 0.0 125.0 # 1 A Y 1.0 64.0 # 2 B X 10.0 14.0 # 3 B Y 17.0 8.0
Gรฉrer les valeurs manquantes N๐โN : ๐โ๐ซโ๐จโ๐ฉโ๐งโ๐โ
Si la colonne spรฉcifique comme premier argument dans ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() contient des valeurs manquantes N๐โN , ces lignes sont ignorรฉes par dรฉfaut. La dรฉfinition de l’argument ๐โ๐ซโ๐จโ๐ฉโ๐งโ๐โ sur F๐โ๐ฅโ๐ฌโ๐โ traite N๐โN comme une clรฉ.
df_nan = df.copy() df_nan.iloc[0, 1] = float('nan') df_nan.iloc[5, 1] = float('nan') print(df_nan) # c_0 c_1 c_2 c_3 # r_0 A NaN 0 125 # r_1 A Y 1 64 # r_2 B X 4 27 # r_3 B Y 9 16 # r_4 B X 16 1 # r_5 B NaN 25 0 print(df_nan.groupby(['c_0', 'c_1']).mean()) # c_2 c_3 # c_0 c_1 # A Y 1.0 64.0 # B X 10.0 14.0 # Y 9.0 16.0 print(df_nan.groupby(['c_0', 'c_1'], dropna=False).mean()) # c_2 c_3 # c_0 c_1 # A Y 1.0 64.0 # NaN 0.0 125.0 # B X 10.0 14.0 # Y 9.0 16.0 # NaN 25.0 0.0
Consultez l’article suivant pour gรฉrer les valeurs manquantes dans pandas.
Obtention des donnรฉes dans chaque groupe : ๐ โ๐โ๐ญโ_๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ()
Vous pouvez obtenir des donnรฉes de chaque groupe ร l’aide de la mรฉthode ๐ โ๐โ๐ญโ_๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ() de l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ .
Spรฉcifiez le nom de la colonne comme argument. Si le groupe est basรฉ sur plusieurs colonnes, utilisez un tuple contenant ces noms de colonnes. Cette mรฉthode renvoie une D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ qui inclut les colonnes spรฉcifiรฉes comme clรฉs.
print(df.groupby('c_0').get_group('B')) # c_0 c_1 c_2 c_3 # r_2 B X 4 27 # r_3 B Y 9 16 # r_4 B X 16 1 # r_5 B Y 25 0 print(df.groupby(['c_0', 'c_1']).get_group(('B', 'X'))) # c_0 c_1 c_2 c_3 # r_2 B X 4 27 # r_4 B X 16 1
Le nombre de points de donnรฉes dans chaque groupe peut รชtre obtenu ร l’aide de la mรฉthode ๐ฌโ๐ขโ๐ณโ๐โ() .
print(df.groupby('c_0').size()) # c_0 # A 2 # B 4 # dtype: int64 print(df.groupby(['c_0', 'c_1']).size()) # c_0 c_1 # A X 1 # Y 1 # B X 2 # Y 2 # dtype: int64
Appliquer plusieurs processus : ๐โ๐ โ๐ โ()
Utilisez la mรฉthode ๐โ๐ โ๐ โ() de l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ pour appliquer plusieurs processus simultanรฉment.
Vous pouvez dรฉfinir le nom de la mรฉthode de l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ sous forme de chaรฎne. S’il est spรฉcifiรฉ sous forme de liste, plusieurs processus seront appliquรฉs. Il est รฉgalement possible d’appliquer diffรฉrents processus ร chaque colonne ร l’aide d’un dictionnaire ( ๐โ๐ขโ๐โ๐ญโ ) avec les noms de colonnes comme clรฉs.
print(df.groupby(['c_0', 'c_1']).agg('mean')) # c_2 c_3 # c_0 c_1 # A X 0.0 125.0 # Y 1.0 64.0 # B X 10.0 14.0 # Y 17.0 8.0 print(df.groupby(['c_0', 'c_1']).agg(['mean', 'min', 'max'])) # c_2 c_3 # mean min max mean min max # c_0 c_1 # A X 0.0 0 0 125.0 125 125 # Y 1.0 1 1 64.0 64 64 # B X 10.0 4 16 14.0 1 27 # Y 17.0 9 25 8.0 0 16 print(df.groupby(['c_0', 'c_1']).agg({'c_2': 'sum', 'c_3': ['min', 'max']})) # c_2 c_3 # sum min max # c_0 c_1 # A X 0 125 125 # Y 1 64 64 # B X 20 1 27 # Y 34 0 16
La spรฉcification d’un nom de mรฉthode inexistant entraรฎne une erreur.
# print(df.groupby(['row_0', 'row_1']).agg('xxx')) # AttributeError: 'xxx' is not a valid function for 'DataFrameGroupBy' object # print(df.groupby(['row_0', 'row_1']).agg(['xxx'])) # AttributeError: 'SeriesGroupBy' object has no attribute 'xxx'
Comme vous pouvez le voir dans le message d’erreur ci-dessus, lorsqu’une seule chaรฎne est spรฉcifiรฉe, la mรฉthode D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โG๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ est utilisรฉe ; Lorsqu’une liste est spรฉcifiรฉe, la mรฉthode S๐โ๐ซโ๐ขโ๐โ๐ฌโG๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ est utilisรฉe.
Des objets appelables tels que des fonctions dรฉfinies avec des expressions ๐โ๐โ๐โ ou lambda peuvent รฉgalement รชtre spรฉcifiรฉs.
def my_func(x): return x.max() + x.min() print(df.groupby(['c_0', 'c_1']).agg([my_func, lambda x: x.sum() - x.mean()])) # c_2 c_3 # my_func <lambda_0> my_func <lambda_0> # c_0 c_1 # A X 0 0.0 250 0.0 # Y 2 0.0 128 0.0 # B X 20 10.0 28 14.0 # Y 34 17.0 16 8.0
Qu’il soit spรฉcifiรฉ comme un รฉlรฉment unique ou dans une liste, S๐โ๐ซโ๐ขโ๐โ๐ฌโ est transmis aux objets appelables.
print(df.groupby(['c_0', 'c_1']).agg(lambda x: str(type(x))).iloc[0, 0]) # <class 'pandas.core.series.Series'> print(df.groupby(['c_0', 'c_1']).agg([lambda x: str(type(x))]).iloc[0, 0]) # <class 'pandas.core.series.Series'> print(df.groupby(['c_0', 'c_1']).agg(lambda x: str(x.values))) # c_2 c_3 # c_0 c_1 # A X [0] [125] # Y [1] [64] # B X [ 4 16] [27 1] # Y [ 9 25] [16 0]
Calculer plusieurs statistiques : ๐โ๐โ๐ฌโ๐โ๐ซโ๐ขโ๐โ๐โ()
Utilisez la mรฉthode ๐โ๐โ๐ฌโ๐โ๐ซโ๐ขโ๐โ๐โ() de l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ pour calculer simultanรฉment les statistiques clรฉs de chaque groupe. Cela est plus pratique que d’indiquer chaque statistique individuellement ร l’aide de ๐โ๐ โ๐ โ() .
L’exemple suivant gรฉnรจre uniquement des rรฉsultats pour la colonne ๐โ_2 .
print(df.groupby(['c_0', 'c_1']).describe()['c_2']) # count mean std min 25% 50% 75% max # c_0 c_1 # A X 1.0 0.0 NaN 0.0 0.0 0.0 0.0 0.0 # Y 1.0 1.0 NaN 1.0 1.0 1.0 1.0 1.0 # B X 2.0 10.0 8.485281 4.0 7.0 10.0 13.0 16.0 # Y 2.0 17.0 11.313708 9.0 13.0 17.0 21.0 25.0
Voir l’article suivant pour la signification de chaque statistique.
Appliquez n’importe quelle fonction ร chaque groupe : ๐โ๐ฉโ๐ฉโ๐ฅโ๐ฒโ()
Utilisez la mรฉthode ๐โ๐ฉโ๐ฉโ๐ฅโ๐ฒโ() de l’objet G๐ซโ๐จโ๐ฎโ๐ฉโB๐ฒโ pour appliquer n’importe quelle fonction ร chaque groupe.
Chaque groupe est transmis sous forme de D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ ร la fonction (objet appelable) spรฉcifiรฉe dans le premier argument. Notez que le D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ transmis inclut les colonnes spรฉcifiques comme clรฉs.
print(df.groupby(['c_0', 'c_1']).apply(lambda x: type(x))) # c_0 c_1 # A X <class 'pandas.core.frame.DataFrame'> # Y <class 'pandas.core.frame.DataFrame'> # B X <class 'pandas.core.frame.DataFrame'> # Y <class 'pandas.core.frame.DataFrame'> # dtype: object dfs = [] df.groupby(['c_0', 'c_1']).apply(lambda x: dfs.append(x)) print(dfs[0]) # c_0 c_1 c_2 c_3 # r_0 A X 0 125 print(dfs[1]) # c_0 c_1 c_2 c_3 # r_1 A Y 1 64 print(dfs[2]) # c_0 c_1 c_2 c_3 # r_2 B X 4 27 # r_4 B X 16 1 print(dfs[3]) # c_0 c_1 c_2 c_3 # r_3 B Y 9 16 # r_5 B Y 25 0
La forme du rรฉsultat change en fonction du type d’objet renvoyรฉ par la fonction spรฉcifiรฉe dans ๐โ๐ฉโ๐ฉโ๐ฅโ๐ฒโ() et des arguments de ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() .
Certains modรจles sont prรฉsentรฉs ci-dessous. En raison de sa complexitรฉ, il n’est pas nรฉcessaire de mรฉmoriser tous les modรจles dรฉtaillรฉs. Au lieu de cela, sachez simplement qu’il existe diffรฉrents modรจles. Lorsque vous l’utilisez rรฉellement, c’est une bonne idรฉe d’expรฉrimenter avec vos entrรฉes attendues pour voir les rรฉsultats.
La spรฉcification d’une fonction qui renvoie une valeur scalaire gรฉnรจre un S๐โ๐ซโ๐ขโ๐โ๐ฌโ . Cependant, avec ๐โ๐ฌโ_๐ขโ๐งโ๐โ๐โ๐ฑโ=F๐โ๐ฅโ๐ฌโ๐โ , elle renvoie un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ .
print(df.groupby(['c_0', 'c_1']).apply(lambda x: x['c_2'].max())) # c_0 c_1 # A X 0 # Y 1 # B X 16 # Y 25 # dtype: int64 print(df.groupby(['c_0', 'c_1'], as_index=False).apply(lambda x: x['c_2'].max())) # c_0 c_1 None # 0 A X 0 # 1 A Y 1 # 2 B X 16 # 3 B Y 25
Lorsque vous spรฉcifiez une fonction qui renvoie un S๐โ๐ซโ๐ขโ๐โ๐ฌโ , un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ est renvoyรฉ si l’index du S๐โ๐ซโ๐ขโ๐โ๐ฌโ correspond au nom de la colonne d’origine, ou un S๐โ๐ซโ๐ขโ๐โ๐ฌโ est renvoyรฉ s’il diffรจre.
print(dfs[0][['c_2', 'c_3']].max()) # c_2 0 # c_3 125 # dtype: int64 print(dfs[0][['c_2', 'c_3']].max(axis=1)) # r_0 125 # dtype: int64 print(df.groupby(['c_0', 'c_1']).apply(lambda x: x[['c_2', 'c_3']].max())) # c_2 c_3 # c_0 c_1 # A X 0 125 # Y 1 64 # B X 16 27 # Y 25 16 print(df.groupby(['c_0', 'c_1']).apply(lambda x: x[['c_2', 'c_3']].max(axis=1))) # c_0 c_1 # A X r_0 125 # Y r_1 64 # B X r_2 27 # r_4 16 # Y r_3 16 # r_5 25 # dtype: int64
De plus, lorsqu’un S๐โ๐ซโ๐ขโ๐โ๐ฌโ est renvoyรฉ, l’index change en fonction des arguments ๐โ๐ฌโ_๐ขโ๐งโ๐โ๐โ๐ฑโ et ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ_๐คโ๐โ๐ฒโ๐ฌโ de ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() .
print( df.groupby(['c_0', 'c_1'], as_index=False).apply( lambda x: x[['c_2', 'c_3']].max(axis=1) ) ) # 0 r_0 125 # 1 r_1 64 # 2 r_2 27 # r_4 16 # 3 r_3 16 # r_5 25 # dtype: int64 print( df.groupby(['c_0', 'c_1'], group_keys=False).apply( lambda x: x[['c_2', 'c_3']].max(axis=1) ) ) # r_0 125 # r_1 64 # r_2 27 # r_4 16 # r_3 16 # r_5 25 # dtype: int64
La spรฉcification d’une fonction qui renvoie un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ gรฉnรจre un D๐โ๐ญโ๐โF๐ซโ๐โ๐ฆโ๐โ . L’index change en fonction des arguments ๐โ๐ฌโ_๐ขโ๐งโ๐โ๐โ๐ฑโ et ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ_๐คโ๐โ๐ฒโ๐ฌโ de ๐ โ๐ซโ๐จโ๐ฎโ๐ฉโ๐โ๐ฒโ() .
print(df.groupby(['c_0', 'c_1']).apply(lambda x: x[['c_2', 'c_3']] * 10)) # c_2 c_3 # c_0 c_1 # A X r_0 0 1250 # Y r_1 10 640 # B X r_2 40 270 # r_4 160 10 # Y r_3 90 160 # r_5 250 0 print( df.groupby(['c_0', 'c_1'], as_index=False).apply(lambda x: x[['c_2', 'c_3']] * 10) ) # c_2 c_3 # 0 r_0 0 1250 # 1 r_1 10 640 # 2 r_2 40 270 # r_4 160 10 # 3 r_3 90 160 # r_5 250 0 print( df.groupby(['c_0', 'c_1'], group_keys=False).apply(lambda x: x[['c_2', 'c_3']] * 10) ) # c_2 c_3 # r_0 0 1250 # r_1 10 640 # r_2 40 270 # r_3 90 160 # r_4 160 10 # r_5 250 0
