web-dev-qa-db-fra.com

pandas python: Supprimez les doublons des colonnes A, en conservant la rangée avec la valeur la plus élevée dans la colonne B

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

Donc ça:

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

Devrait se transformer en ceci:

A B
1 20
2 40
3 10

Wes a ajouté des fonctionnalités Nice pour supprimer les doublons: http://wesmckinney.com/blog/?p=340 . Mais AFAICT, il est conçu pour les doublons exacts. Par conséquent, aucun critère de sélection des lignes à conserver.

J'imagine qu'il existe probablement un moyen simple de le faire - peut-être aussi facile que de trier le cadre de données avant de supprimer les doublons - mais je ne connais pas suffisamment la logique interne de groupby pour le comprendre. Aucune suggestion?

88
Abe

Cela prend le dernier. Pas le maximum cependant:

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

Vous pouvez aussi 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
116
Wes McKinney

Essaye ça:

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

Vous pouvez aussi essayer ceci

df.drop_duplicates(subset='A', keep='last')

Je l'ai mentionné à partir de https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html

1
Venkat

Solution la plus simple:

Pour supprimer les doublons basés sur une colonne:

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

Pour supprimer les doublons basés sur plusieurs colonnes:

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

Je pense que dans votre cas, vous n'avez pas vraiment besoin d'un groupby. Je trierais par ordre décroissant votre colonne B, puis jetterais les doublons dans la colonne A et si vous le souhaitez, vous pouvez aussi avoir un nouvel index Nice et

df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)
1
whateveros

Quand les articles déjà donnés répondent à la question, j'ai apporté une petite modification en ajoutant le nom de colonne sur lequel la fonction max () est appliquée pour une meilleure lisibilité du code.

df.groupby('A', as_index=False)['B'].max()
0
Bhagabat Behera