Voici quelques conseils utiles pour Group By que j'ai appris en entrant dans le Data Science Bowl 2019 de Kaggle.
Utilisez les données fictives suivantes
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 |
Utilisez first ()
ou head (1)
, nth (0)
head (n)
obtient n lignes à partir du début de chaque groupe, alors spécifiez n = 1
si vous voulez la première ligne
nth (n)
obtient la nième ligne de chaque groupe, donc si vous voulez la première ligne, spécifiez n = 0
Notez que chaque méthode se comporte différemment lorsqu'il y a des valeurs manquantes.
Puisque first ()
obtient la première valeur non-NaN pour chaque colonne, il peut renvoyer des données épissées à partir de lignes séparées s'il contient des valeurs manquantes.
head ()
obtient n lignes depuis le début, y compris les valeurs manquantes
Le comportement de nth ()
diffère selon la valeur de réglage de dropna
( None
, ʻany, ʻall
).
De plus, first ()
et nth ()
ont le même format de sortie, mais head ()
est différent.
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
S'il y a des valeurs manquantes
#Création de données omise
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
#⇒ Les données Eve et Alice sont épissées avec d'autres données!
with_nan_df.groupby('state').head(1)
# name state score
#0 Alice NY NaN
#1 Bob CA 3.0
#4 Eve FL NaN
#⇒ NaN reste tel quel!
Consultez la page suivante pour plus de détails sur la différence de comportement en cas de valeurs manquantes. [Pandas] L'histoire de la première / dernière fonction qui trouve la première / dernière ligne de groupby, la différence entre head et nth
Utilisez last ()
ou tail (1)
, nth (-1)
tail (n)
obtient n lignes de la fin de chaque groupe, alors spécifiez n = 1
si vous voulez la dernière ligne
nth (n)
obtient la nième ligne de chaque groupe, donc si vous voulez la dernière ligne, spécifiez n = -1
Notez que chaque méthode se comporte différemment lorsqu'il y a des valeurs manquantes, tout comme lorsque la première ligne a été extraite précédemment.
last ()
se comporte de la même manière que first () ʻet
tail () se comporte de la même manière que
head ()`
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
Utilisez size ()
Des résultats similaires peuvent être obtenus avec value_counts ()
lorsque group by
est effectué avec une seule colonne, mais c'est pratique lors de la récupération du nombre de données pour chaque paire pour plusieurs colonnes.
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
Obtenez le nombre de données pour chaque paire pour plusieurs colonnes
#Création de données omise
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
Vous pouvez utiliser shift ()
pour le résultat de group by
#Trier les données par état pour rendre les résultats plus faciles à voir
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
Appliquer cumsum ()
au résultat de groupby
en utilisant ʻapply`
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
Par exemple, le programme suivant obtient le nombre de types d'équipes pour chaque état
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
Il y a des erreurs et de meilleures façons! Je vous serais reconnaissant si vous pouviez me dire
Recommended Posts