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