[pandas] Conseils GroupBy

introduction

Voici quelques conseils utiles pour Group By que j'ai appris en entrant dans le Data Science Bowl 2019 de Kaggle.

Environnement d'exploitation

Données à utiliser

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

Extraire la première ligne de chaque groupe

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

Extraire la dernière ligne de chaque groupe

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

Obtenez la taille de chaque groupe

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

Déplacer les données par groupe

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

Prenez la somme cumulée pour chaque groupe

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

Obtenez le nombre de catégories pour chaque groupe

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

à la fin

Il y a des erreurs et de meilleures façons! Je vous serais reconnaissant si vous pouviez me dire

Recommended Posts

[pandas] Conseils GroupBy
[Astuces] Ma note Pandas
Pandas
Conseils de traitement des données avec Pandas
Mémo Pandas
astuces python
Le tour de Jupyter 4
GroupBy Remarque
Pandas: groupby () pour compléter la valeur par groupe
astuces numpy
Astuce de Jupyter 5
Notions de base sur les pandas
Astuces Scapy
Astuce de Jupyter 3
Notes de pandas
Le tour de Jupyter 2
Conseils pour tracer plusieurs lignes avec des pandas
Mémorandum de Pandas
Notions de base sur les pandas
mémorandum pandas
mémo pandas
pandas SettingWithCopyWarning
Astuces Python
Astuces Python
Dessinez un graphique en traitant avec Pandas groupby