Eliminar duplicados de las columnas A, manteniendo la fila con el valor más alto en la columna B
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?
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
La respuesta principal es hacer demasiado trabajo y parece ser muy lento para conjuntos de datos más grandes. apply
es lento y debe evitarse si es posible. ix
está 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()
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')