Pandas : extraire efficacement les principaux enregistrements de chaque groupe
L'obtention des meilleurs enregistrements de chaque groupe d'un DataFrame est une tâche courante dans la manipulation de données . Cet article présente plusieurs approches pour atteindre cet objectif, y compris une solution inspirée des fonctions de fenêtre SQL.
Énoncé du problème :
Étant donné un DataFrame avec une colonne de regroupement et une colonne de valeur, nous souhaitez extraire les n premiers enregistrements pour chaque groupe.
Approche naïve avec regroupement et rangée Numérotation :
Une façon d'aborder ce problème consiste à appliquer une opération de regroupement, suivie d'une approche de type fonction de fenêtre. Cela implique d'ajouter un numéro de ligne à chaque enregistrement au sein de chaque groupe, puis de filtrer les lignes supérieures en fonction de ce numéro de ligne.
Solution pratique :
Une solution plus efficace consiste à utiliser le méthode head() sur le DataFrame groupé. Par défaut, head() renvoie les n premiers enregistrements de chaque groupe. Cela correspond bien à l'objectif d'obtenir les meilleurs enregistrements.
df.groupby('id').head(2)
Suppression du MultiIndex :
Pour supprimer le MultiIndex introduit par l'opération de regroupement, nous utilisons reset_index(drop=True) :
df.groupby('id').head(2).reset_index(drop=True)
Sortie :
id value 0 1 1 1 1 2 2 2 1 3 2 2 4 3 1 5 4 1
Approche élégante pour la numérotation des lignes :
Alors que Python n'a pas la fonction row_number() de SQL, nous pouvons répliquer ses fonctionnalités en utilisant une combinaison de groupby() et cumcount(). Voici comment :
df['row_num'] = df.groupby('id').cumcount() + 1
Cette approche attribue un numéro de ligne unique au sein de chaque groupe sans introduire de colonnes supplémentaires ni de multi-index.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!