English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

GroupBy Pandas

Pandas GroupBy的操作实例

任何groupby操作都会对原始对象进行以下操作:

拆分对象 应用函数 合并结果

在许多情况下,我们将数据分成几组,然后在每个子集上应用一些功能。在Apply功能中,我们可以执行以下操作-

聚合 − 计算汇总统计 Transformation − 分组操作 Filtrer − 在某些条件下过滤数据

现在我们创建一个DataFrame对象并对其执行所有操作。

#import the pandas library
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 print(df)

Les résultats de l'exécution sont les suivants :

      Points Rank Team Year
0      876      1   Riders   2014
1      789      2   Riders   2015
2      863      2   Devils   2014
3      673      3   Devils   2015
4      741      3    Kings   2014
5      812      4    kings   2015
6      756      1    Kings   2016
7      788      1    Kings   2017
8      694      2   Riders   2016
9      701      4   Royals   2014
10     804      1   Royals   2015
11     690      2   Riders   2017

将数据分组

对象可以拆分为任何对象。有多种拆分对象的方法,例如:

obj.groupby('key') obj.groupby(['key1','key2) obj.groupby(key,axis=1)

现在我们看看如何将分组对象应用于DataFrame对象

示例

# importer la bibliothèque pandas
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team'))

Les résultats de l'exécution sont les suivants :

   

查看分组

# importer la bibliothèque pandas
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team').groups)

Les résultats de l'exécution sont les suivants :

   {'Kings': Int64Index([4, 6, 7], dtype='int64'),
 'Devils': Int64Index([2, 3], dtype='int64'),
 'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),
 'Royals': Int64Index([9, 10], dtype='int64'),
 'kings' : Int64Index([5], dtype='int64})

示例

按多列分组

# importer la bibliothèque pandas
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 print(df.groupby(['Team','Year']).groups)

Les résultats de l'exécution sont les suivants :

   {('Kings', 2014]): Int64Index([4], dtype='int64'),
  ('Royals', 2014]): Int64Index([9], dtype='int64'),
  ('Riders', 2014]): Int64Index([0], dtype='int64'),
  ('Riders', 2015]): Int64Index([1], dtype='int64'),
  ('Kings', 2016]): Int64Index([6], dtype='int64'),
  ('Riders', 2016]): Int64Index([8], dtype='int64'),
  ('Riders', 2017]): Int64Index([11], dtype='int64'),
  ('Devils', 2014]): Int64Index([2], dtype='int64'),
  ('Devils', 2015]): Int64Index([3], dtype='int64'),
  ('kings', 2015]): Int64Index([5], dtype='int64'),
  ('Royals', 2015]): Int64Index([10], dtype='int64'),
  ('Kings', 2017]): Int64Index([7], dtype='int64})

Parcourir les groupes

Avec l'objet grouping, nous pouvons itérer sur l'objet de manière similaire à itertools.obj.

# importer la bibliothèque pandas
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Year')
 for name, group in grouped:
    print(name)
    print(group)

Les résultats de l'exécution sont les suivants :

  2014
   Points  Classement     Équipe   Année
0     876     1   Riders   2014
2     863     2   Devils   2014
4     741     3   Kings    2014
9     701     4   Royals   2014
2015
   Points  Classement     Équipe   Année
1     789     2   Riders   2015
3     673     3   Devils   2015
5     812     4    kings   2015
10    804     1   Royals   2015
2016
   Points  Classement     Équipe   Année
6     756     1    Kings   2016
8     694     2   Riders   2016
2017
   Points                             Rank                             Équipe                             Année
7     788     1   Kings   2017
11    690     2  Riders   2017

Par défaut, le nom de l'étiquette de l'objet grouping est le même que le nom du groupe.

Sélectionner le groupe p

# importer la bibliothèque pandas
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Year')
 print(grouped.get_group(2014))

Les résultats de l'exécution sont les suivants :

     Points                             Rank                             Équipe                             Année
0     876     1   Riders    2014
2     863     2   Devils    2014
4     741     3   Kings     2014
9     701     4   Royals    2014

Collectif

Les fonctions d'agrégation retournent une valeur d'agrégation pour chaque groupe. Une fois que l'objet de grouping est créé, plusieurs opérations d'agrégation peuvent être exécutées sur les données de grouping.

Une méthode évidente pour effectuer des totaux est de passer par la méthode de totalisation ou équivalente agg.

# importer la bibliothèque pandas
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Year')
 print(grouped['Points'].agg(np.mean))

Les résultats de l'exécution sont les suivants :

  Année
2014   795.25
2015   769.50
2016   725.00
2017   739.00
Nom: Points, dtype: float64

Une autre manière de voir la taille de chaque groupe est d'appliquer la fonction size().

import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 Accès aux attributs en Python Pandas
 grouped = df.groupby('Team')
 print(grouped.agg(np.size))

Les résultats de l'exécution sont les suivants :

       Points                             Rank                             Année
Équipe
Devils        2      2      2
Kings         3      3      3
Riders        4      4      4
Royals        2      2      2
kings         1      1      1

Application multiple de fonctions d'agrégation

Grâce aux séries de grouping, vous pouvez également passer une liste ou un dictionnaire de fonctions pour l'agrégation et générer un DataFrame en sortie-

# importer la bibliothèque pandas
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Team')
 print(grouped['Points'].agg([np.sum, np.mean, np.std]))

Les résultats de l'exécution sont les suivants :

  Équipe                           somme                               moyenne                                   écart-type
Devils   1536   768.000000   134.350288
Kings    2285   761.666667    24.006943
Riders   3049   762.250000    88.567771
Royals   1505   752.500000    72.831998
kings     812   812.000000                           NaN

Transformation

Une transformation sur un groupe ou une colonne retourne un index, la taille de cet index est égale à la taille de l'objet en cours de grouping. Par conséquent, la transformation doit retourner un résultat de la même taille que le bloc de groupe.

# importer la bibliothèque pandas
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 grouped = df.groupby('Team')
 score = lambda x: (x - x.mean()) / x.std()*10
 print(grouped.transform(score))

Les résultats de l'exécution sont les suivants :

     Points        Classement       Année
0   12.843272  -15.000000  -11.618950
1   3.020286     5.000000   -3.872983
2   7.071068    -7.071068   -7.071068
3  -7.071068     7.071068    7.071068
4  -8.608621    11.547005  -10.910895
5        NaN          NaN         NaN
6  -2.360428    -5.773503    2.182179
7  10.969049    -5.773503    8.728716
8  -7.705963     5.000000    3.872983
9  -7.071068     7.071068   -7.071068
10  7.071068    -7.071068    7.071068
11 -8.157595     5.000000   11.618950

Filtrer

Filtrer les données en fonction des conditions définies et retourner un sous-ensemble de données. La fonction de filtrage () est utilisée pour filtrer les données.

 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team').filter(lambda x: len(x) >= 3))

Les résultats de l'exécution sont les suivants :

      Points  Classement     Équipe   Année
0      876     1   Riders   2014
1      789     2   Riders   2015
4      741     3   Kings    2014
6      756     1   Kings    2016
7      788     1   Kings    2017
8      694     2   Riders   2016
11     690     2   Riders   2017