Hier sind einige nützliche Tipps für Group By, die ich bei der Eingabe von Kaggles Data Science Bowl 2019 gelernt habe.
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 |
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
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
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
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
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
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
Es gibt Fehler und bessere Wege! Ich wäre Ihnen dankbar, wenn Sie es mir sagen könnten
Recommended Posts