Tengo un marco de datos con valores de repetición 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
Wes ha agregado una buena funcionalidad 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 mantienen.
Supongo que probablemente haya una manera fácil de hacer esto, tal vez tan fácil como ordenar el marco de datos antes de soltar duplicados, pero no conozco la lógica interna de groupby lo suficientemente bien como para descubrirlo. ¿Alguna sugerencia?
python
duplicates
pandas
Abe
fuente
fuente
Respuestas:
Esto lleva lo último. Sin embargo, no es el máximo:
También puedes hacer algo como:
fuente
cols
ytake_last
se deprecian y han sido reemplazados por los parámetrossubset
ykeep
. pandas.pydata.org/pandas-docs/version/0.17.1/generated/…FutureWarning: the take_last=True keyword is deprecated, use keep='last' instead
df.sort_values(by=['B']).drop_duplicates(subset=['A'], keep='last')
? Quiero decir que este sort_values me parece seguro, pero no tengo idea de si realmente lo es.group_by
, puede agregar.reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Esto restablecerá el índice ya que su valor predeterminado sería un índice múltiple compilado desde'A'
y'C'
La respuesta principal es hacer demasiado trabajo y parece ser muy lenta 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.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()
fuente
lamba
función al soltar. Por ejemplo, ¿cómo puedo soltar solo valores menores que el promedio de esos valores duplicados?La solución más simple:
Para soltar duplicados basados en una columna:
Para soltar duplicados basados en múltiples columnas:
fuente
Prueba esto:
fuente
Primero ordenaría el marco de datos con la columna B descendente, luego soltaría los duplicados para la columna A y me quedaría primero
sin ningún grupo
fuente
Puedes probar esto también
Remití esto desde https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
fuente
Creo que en tu caso realmente no necesitas un grupo. Ordenaría por orden descendente su columna B, luego soltaría duplicados en la columna A y si lo desea, también puede tener un nuevo índice agradable y limpio como ese:
fuente
Aquí hay una variación que tuve que resolver que vale la pena compartir: para cada cadena única en la
columnA
que quería encontrar la cadena asociada más comúncolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
La
.any()
recoge uno si hay un empate para el modo. (Tenga en cuenta que el uso.any()
en una serie deint
s devuelve un valor booleano en lugar de elegir uno de ellos).Para la pregunta original, el enfoque correspondiente se simplifica a
df.groupby('columnA').columnB.agg('max').reset_index()
.fuente
Cuando las publicaciones ya respondieron la pregunta, hice un pequeño cambio agregando el nombre de la columna en la que se aplica la función max () para una mejor legibilidad del código.
fuente
La forma más fácil de hacer esto:
fuente
esto también funciona:
fuente
No voy a darle la respuesta completa (no creo que esté buscando el análisis y la escritura en la parte del archivo de todos modos), pero una sugerencia fundamental debería ser suficiente: use la
set()
función de Python y luegosorted()
o.sort()
junto con.reverse()
:fuente