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

Pandas GroupBy

Beispiel für die Operationen von Pandas GroupBy

Jegliche groupby-Operation führt auf dem ursprünglichen Objekt die folgenden Operationen aus:

Objekte teilen Funktion anwenden Ergebnisse zusammenführen

In vielen Fällen teilen wir die Daten in mehrere Gruppen und wenden einige Funktionen auf jede Untergruppe an. In der Apply-Funktion können wir folgende Operationen ausführen-

Aggregation − Zusammenfassende Statistiken berechnen Transformation − Gruppierungsoperationen Filtern − Daten unter bestimmten Bedingungen filtern

Nun erstellen wir ein DataFrame-Objekt und führen alle Operationen darauf durch.

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

Die Ergebnisse des Laufens sind wie folgt:

      Punkte  Rang  Team  Jahr
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

Daten in Gruppen teilen

Objekte können in beliebige andere Objekte aufgeteilt werden. Es gibt mehrere Methoden zur Aufteilung von Objekten, z.B.:

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

Lassen Sie uns nun sehen, wie wir den Gruppierungsobjekt auf das DataFrame anwenden

Beispiel

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[876,789,863,673,741,812,756,788,694,701,804,690]}}
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team'))

Die Ergebnisse des Laufens sind wie folgt:

   

Gruppen anzeigen

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[876,789,863,673,741,812,756,788,694,701,804,690]}}
 df = pd.DataFrame(ipl_data)
 print(df.groupby('Team').groups)

Die Ergebnisse des Laufens sind wie folgt:

   {'Könige': Int64Index([4, 6, 7, dtype='int64'),
 'Teufel': Int64Index([2, 3, dtype='int64'),
 'Reiter': Int64Index([0, 1, 8, 11, dtype='int64'),
 'Könige': Int64Index([9, 10, dtype='int64'),
 'kings' : Int64Index([5, dtype='int64})

Beispiel

Gruppierung mit mehreren Spalten

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[876,789,863,673,741,812,756,788,694,701,804,690]}}
 df = pd.DataFrame(ipl_data)
 print(df.groupby(['Team','Jahr']).groups)

Die Ergebnisse des Laufens sind wie folgt:

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

Gruppen durchlaufen

Mit dem groupby-Objekt können wir das Objekt ähnlich wie itertools.obj durchlaufen.

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[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)

Die Ergebnisse des Laufens sind wie folgt:

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

Standardmäßig sind die Namen der groupby-Objekte und der Gruppennamen identisch.

Gruppe p auswählen

Mit dem get_group()-Verfahren können wir eine Gruppe auswählen.

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[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))

Die Ergebnisse des Laufens sind wie folgt:

     Punkte                      Rang                      Team                      Jahr
0     876     1   Riders    2014
2     863     2   Devils    2014
4     741     3   Kings     2014
9     701     4   Royals    2014

Kollektiv

Aggregationsfunktionen geben für jede Gruppe einen Aggregatswert zurück. Sobald ein Groups-Objekt erstellt wurde, können mehrere Aggregationsoperationen auf den gruppierten Daten ausgeführt werden.

Eine offensichtliche Methode ist die Verwendung von Summen oder einem äquivalenten agg-Verfahren.

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[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))

Die Ergebnisse des Laufens sind wie folgt:

  Jahr
2014   795.25
2015   769.50
2016   725.00
2017   739.00
Name: Punkte, dtype: float64

Eine andere Möglichkeit, die Größe jedes Groups zu überprüfen, ist die Anwendung der size()-Funktion.

import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[876,789,863,673,741,812,756,788,694,701,804,690]}}
 df = pd.DataFrame(ipl_data)
 Attributzugriff in Python Pandas
 grouped = df.groupby('Team')
 print(grouped.agg(np.size))

Die Ergebnisse des Laufens sind wie folgt:

       Punkte                      Rang                      Jahr
Team
Devils        2      2      2
Kings         3      3      3
Riders        4      4      4
Royals        2      2      2
kings         1      1      1

Mehrere Aggregationsfunktionen anwenden

Mit der gruppierten Series können Sie auch Listen oder Wörterbücher von Funktionen anpassen, um Aggregationen durchzuführen und als DataFrame auszugeben-

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[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]))

Die Ergebnisse des Laufens sind wie folgt:

  Team                      Summe              Durchschnitt                                   Standardabweichung
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

Eine Transformation auf dem Index oder den Spalten eines Groups oder Columns gibt einen Index zurück, der die Größe des zu gruppierenden Objekts entspricht. Daher sollte die Transformation ein Ergebnis mit der Größe des Gruppierungsblocks zurückgeben.

# Importieren Sie die pandas-Bibliothek
 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[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))

Die Ergebnisse des Laufens sind wie folgt:

     Punkte        Rang        Jahr
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

Filtern

Filtern Sie Daten gemäß definierten Bedingungen, um einen Unterdatenbestand zurückzugeben. Die Filter() -Funktion wird verwendet, um Daten zu filtern.

 import pandas as pd
 import numpy as np
 ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
    'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
    'Rang': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
    'Jahr': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
    'Punkte':[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))

Die Ergebnisse des Laufens sind wie folgt:

      Punkte  Rang      Team    Jahr
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