Eliminar duplicados de las columnas A, manteniendo la fila con el valor más alto en la columna B

Resuelto Abe asked hace 12 años • 15 respuestas

Tengo un marco de datos con valores repetidos en la columna A. Quiero eliminar duplicados, manteniendo la fila con el valor más alto en la columna B.

Así que esto:

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

Debería convertirse en esto:

A B
1 20
2 40
3 10

Supongo que probablemente haya una manera fácil de hacer esto, tal vez tan fácil como ordenar el DataFrame antes de descartar duplicados, pero no conozco la lógica interna de Groupby lo suficientemente bien como para resolverlo. ¿Alguna sugerencia?

Abe avatar Sep 19 '12 22:09 Abe
Aceptado

Esto toma lo último. Aunque no es el máximo:

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

También puedes hacer algo como:

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
Wes McKinney avatar Oct 25 '2012 00:10 Wes McKinney

La respuesta principal es hacer demasiado trabajo y parece ser muy lento para conjuntos de datos más grandes. applyes lento y debe evitarse si es posible. ixestá en desuso y también debe evitarse.

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

   A   B
1  1  20
3  2  40
4  3  10

O simplemente agrupe por todas las demás columnas y tome el máximo de la columna que necesita.df.groupby('A', as_index=False).max()

Ted Petrou avatar Jan 14 '2017 14:01 Ted Petrou

Solución más sencilla:

Para eliminar duplicados basados ​​en una columna:

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

Para eliminar duplicados basados ​​en varias columnas:

df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')
Gil Baggio avatar Mar 06 '2019 11:03 Gil Baggio