270 votes

Supprimer les doublons dans les colonnes A, en conservant la ligne ayant la valeur la plus élevée dans la colonne B.

J'ai un tableau de données avec des valeurs répétées dans la colonne A. Je veux supprimer les doublons, en conservant la ligne avec la valeur la plus élevée dans la colonne B.

Voici donc ce qu'il en est :

A B
1 10
1 20
2 30
2 40
3 10

Il devrait se transformer en ceci :

A B
1 20
2 40
3 10

Je suppose qu'il y a probablement un moyen simple de faire cela - peut-être aussi simple que de trier le DataFrame avant de supprimer les doublons - mais je ne connais pas assez bien la logique interne de groupby pour la comprendre. Des suggestions ?

306voto

Wes McKinney Points 17545

Il s'agit de la dernière. Mais pas le maximum :

In [10]: df.drop_duplicates(subset='A', keep="last")
Out[10]: 
   A   B
1  1  20
3  2  40
4  3  10

Vous pouvez également faire quelque chose comme :

In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])
Out[12]: 
   A   B
A       
1  1  20
2  2  40
3  3  10

137voto

Ted Petrou Points 20559

La réponse du haut fait trop de travail et semble être très lente pour les grands ensembles de données. apply est lent et doit être évité dans la mesure du possible. ix est obsolète et doit être évitée.

df.sort_values('B', ascending=False).drop_duplicates('A').sort_index()

   A   B
1  1  20
3  2  40
4  3  10

Vous pouvez également regrouper toutes les autres colonnes et prendre la valeur maximale de la colonne dont vous avez besoin. df.groupby('A', as_index=False).max()

42voto

Gil Baggio Points 2137

La solution la plus simple :

Pour supprimer les doublons sur la base d'une seule colonne :

df = df.drop_duplicates('column_name', keep='last')

Pour supprimer les doublons sur la base de plusieurs colonnes :

df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')

24voto

Nobel Points 439

Je trierais d'abord la colonne B en ordre décroissant, puis j'éliminerais les doublons de la colonne A et je conserverais la première colonne.

df = df.sort_values(by='B', ascending=False)
df = df.drop_duplicates(subset='A', keep="first")

sans groupage

11voto

eumiro Points 56644

Essayez ceci :

df.groupby(['A']).max()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X