[PYTHON] [Pandas] GroupBy-Tipps

Einführung

Hier sind einige nützliche Tipps für Group By, die ich bei der Eingabe von Kaggles Data Science Bowl 2019 gelernt habe.

Betriebsumgebung

Zu verwendende Daten

Verwenden Sie die folgenden fiktiven Daten

import pandas as pd

df = pd.DataFrame({
    'name'    : ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Fred', 'George'],
    'state'   : ['NY', 'CA', 'NY', 'CA', 'FL', 'FL', 'NY'],
    'score'   : [4, 3, 5, 10, 1, 0, 7]
})
name state score
0 Alice NY 4
1 Bob CA 3
2 Charlie NY 5
3 David CA 10
4 Eve FL 1
5 Fred FL 0
6 George NY 7

Extrahieren Sie die erste Zeile jeder Gruppe

Verwenden Sie "first ()" oder "head (1)", "nth (0)" head (n) erhält n Zeilen vom Anfang jeder Gruppe, geben Sie also n = 1 an, wenn Sie die erste Zeile möchten nth (n) erhält die n-te Zeile jeder Gruppe. Wenn Sie also die erste Zeile möchten, geben Sie n = 0 an

Beachten Sie, dass sich jede Methode anders verhält, wenn Werte fehlen. Da first () den ersten Nicht-NaN-Wert für jede Spalte erhält, kann es gespleißte Daten aus separaten Zeilen zurückgeben, wenn es fehlende Werte enthält. head () erhält von Anfang an n Zeilen, einschließlich fehlender Werte Das Verhalten von "nth ()" unterscheidet sich je nach Einstellwert von "dropna" ("None", "any", "all").

Außerdem haben first () und nth () das gleiche Ausgabeformat, aber head () ist unterschiedlich.

df.groupby('state').first()
#        name  score
#state
#CA       Bob      3
#FL       Eve      1
#NY     Alice      4

df.groupby('state').head(1)
#    name state  score
#0  Alice    NY      4
#1    Bob    CA      3
#4    Eve    FL      1

df.groupby('state').nth(0)
#        name  score
#state
#CA       Bob      3
#FL       Eve      1
#NY     Alice      4

Wenn Werte fehlen

#Datenerstellung entfällt
print(with_nan_df)
#      name state  score
#0    Alice    NY    NaN
#1      Bob    CA    3.0
#2  Charlie    NY    5.0
#3    David    CA   10.0
#4      Eve    FL    NaN
#5     Fred    FL    0.0
#6   George    NY    7.0

with_nan_df.groupby('state').first()
#        name  score
#state
#CA       Bob    3.0
#FL       Eve    0.0
#NY     Alice    5.0
#⇒ Eve- und Alice-Daten werden mit anderen Daten verbunden!

with_nan_df.groupby('state').head(1)
#    name state  score
#0  Alice    NY    NaN
#1    Bob    CA    3.0
#4    Eve    FL    NaN
#⇒ NaN bleibt wie es ist!

Auf der folgenden Seite finden Sie Details zum Unterschied im Verhalten bei fehlenden Werten. [Pandas] Die Geschichte der ersten / letzten Funktion, die die erste / letzte Zeile von groupby findet, den Unterschied zwischen head und nth

Extrahieren Sie die letzte Zeile jeder Gruppe

Verwenden Sie last () oder tail (1), nth (-1) tail (n) erhält n Zeilen vom Ende jeder Gruppe, geben Sie also n = 1 an, wenn Sie die letzte Zeile möchten nth (n) erhält die n-te Zeile jeder Gruppe. Wenn Sie also die letzte Zeile möchten, geben Sie n = -1 an

Beachten Sie, dass sich jede Methode anders verhält, wenn Werte fehlen, genau wie beim ersten Extrahieren der ersten Zeile. last () verhält sich genauso wiefirst ()und tail () verhält sich genauso wiehead ()

df.groupby('state').last()
#         name  score
#state
#CA      David     10
#FL       Fred      0
#NY     George      7

df.groupby('state').tail(1)
#     name state  score
#3   David    CA     10
#5    Fred    FL      0
#6  George    NY      7

df.groupby('state').nth(-1)
#         name  score
#state
#CA      David     10
#FL       Fred      0
#NY     George      7

Holen Sie sich die Größe jeder Gruppe

Verwenden Sie size () Ähnliche Ergebnisse können mit "value_counts ()" erzielt werden, wenn "group by" nur mit einer Spalte ausgeführt wird. Dies ist jedoch praktisch, wenn die Anzahl der Daten für jedes Paar für mehrere Spalten abgerufen wird.

df.groupby('state').size()
#state
#CA    2
#FL    2
#NY    3
#dtype: int64

df['state'].value_counts()
#NY    3
#CA    2
#FL    2
#Name: state, dtype: int64

Ermitteln Sie die Anzahl der Daten für jedes Paar für mehrere Spalten

#Datenerstellung weggelassen
print(team_df)
#      name state  score team
#0    Alice    NY      4    A
#1      Bob    CA      3    A
#2  Charlie    NY      5    A
#3    David    CA     10    A
#4      Eve    FL      1    B
#5     Fred    FL      0    B
#6   George    NY      7    B

team_df.groupby(['state', 'team']).size()
#state  team
#CA     A       2
#FL     B       2
#NY     A       2
#       B       1
#dtype: int64

Daten nach Gruppe verschieben

Shift () kann auch für das Ergebnis von group by verwendet werden

#Sortieren Sie die Daten nach Status, damit die Ergebnisse besser sichtbar sind
df.sort_values('state', inplace=True)
print(df)
#      name state  score
#1      Bob    CA      3
#3    David    CA     10
#4      Eve    FL      1
#5     Fred    FL      0
#0    Alice    NY      4
#2  Charlie    NY      5
#6   George    NY      7

df.groupby('state')['score'].shift()
#1    NaN
#3    3.0
#4    NaN
#5    1.0
#0    NaN
#2    4.0
#6    5.0
#Name: score, dtype: float64

Nehmen Sie die kumulative Summe für jede Gruppe

Wenden Sie "cumsum ()" auf das Ergebnis von "groupby" an, indem Sie "apply" verwenden

print(df)
#      name state  score
#1      Bob    CA      3
#3    David    CA     10
#4      Eve    FL      1
#5     Fred    FL      0
#0    Alice    NY      4
#2  Charlie    NY      5
#6   George    NY      7

df.groupby('state').apply(lambda tdf: tdf['score'].cumsum())
#state
#CA     1     3
#       3    13
#FL     4     1
#       5     1
#NY     0     4
#       2     9
#       6    16
#Name: score, dtype: int64

Ermitteln Sie die Anzahl der Kategorien für jede Gruppe

Das folgende Programm ermittelt beispielsweise, wie viele Arten von Teams es für jeden Staat gibt

print(team_df)
#      name state  score team
#0    Alice    NY      4    A
#1      Bob    CA      3    A
#2  Charlie    NY      5    A
#3    David    CA     10    A
#4      Eve    FL      1    B
#5     Fred    FL      0    B
#6   George    NY      7    B

team_df.groupby('state')['team'].agg(lambda x: len(x.unique()))
#state
#CA    1
#FL    1
#NY    2
#Name: team, dtype: int64

schließlich

Es gibt Fehler und bessere Wege! Ich wäre Ihnen dankbar, wenn Sie es mir sagen könnten

Recommended Posts

[Pandas] GroupBy-Tipps
[Tipps] Meine Pandas-Notiz
Pandas
Datenverarbeitungstipps mit Pandas
Pandas Memo
Python-Tipps
Jupyters Trick 4
GroupBy Hinweis
Pandas: groupby (), um den Wert nach Gruppe zu vervollständigen
numpy tipps
Jupyters Trick 5
Pandas Grundlagen
Scapy-Tipps
Jupyters Trick 3
Pandas Notizen
Jupyters Trick 2
Tipps zum Zeichnen mehrerer Linien mit Pandas
Memorandum of Pandas
Pandas Grundlagen
Pandas Memorandum
Pandas Memo
pandas SettingWithCopyWarning
Python-Tipps
Python-Tipps
Zeichnen Sie ein Diagramm, indem Sie es mit Pandas groupby verarbeiten