python - matriz - eliminar fila pandas
pandas de pitón: elimine los duplicados por las columnas A, manteniendo la fila con el valor más alto en la columna B (8)
Tengo un marco de datos con valores de repetición en la columna A. Quiero soltar 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
Wes ha agregado algunas buenas funcionalidades para eliminar duplicados: http://wesmckinney.com/blog/?p=340 . Pero AFAICT está diseñado para duplicados exactos, por lo que no se mencionan los criterios para seleccionar qué filas se guardan.
Supongo que probablemente haya una manera fácil de hacerlo, tal vez tan fácil como ordenar el dataframe antes de descartar duplicados, pero no conozco la lógica interna de groupby lo suficiente como para resolverlo. ¿Alguna sugerencia?
Creo que en tu caso realmente no necesitas un grupo por. Ordenaría por orden descendente su columna B, luego soltaría los duplicados en la columna A y, si lo desea, también puede tener un nuevo índice limpio y agradable como ese:
df.sort_values(''B'', ascending=False).drop_duplicates(''A'').sort_index().reset_index(drop=True)
Cuando las publicaciones ya dadas responden la pregunta, realicé un pequeño cambio al agregar el nombre de columna en el que se aplica la función max () para una mejor legibilidad del código.
df.groupby(''A'', as_index=False)[''B''].max()
Esto toma el último. No el máximo sin embargo:
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 debe evitarse también.
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 otras columnas y tome el máximo de la columna que necesita. df.groupby(''A'', as_index=False).max()
No voy a darle la respuesta completa (no creo que esté buscando la parte de análisis y escritura en el archivo de todos modos), pero una pista fundamental debería ser suficiente: use la función set()
python, y luego sorted()
o .sort()
junto con .reverse()
:
>>> a=sorted(set([10,60,30,10,50,20,60,50,60,10,30]))
>>> a
[10, 20, 30, 50, 60]
>>> a.reverse()
>>> a
[60, 50, 30, 20, 10]
Prueba esto:
df.groupby([''A'']).max()
Puedes probar esto también
df.drop_duplicates(subset=''A'', keep=''last'')
Hice referencia a esto desde https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
esto también funciona:
a=pd.DataFrame({''A'':a.groupby(''A'')[''B''].max().index,''B'':a.groupby(''A'') [''B''].max().values})