with tutorial framework español djangoproject desde con cero applications python pandas group-by pandas-groupby

python - framework - tutorial django



Encontrar el valor máximo en la columna de Python (4)

Tengo un marco de datos ( combined_ranking_df ) como este en pandas python:

Id Rank Activity 0 14035 8.0 deployed 1 47728 8.0 deployed 2 24259 1.0 NaN 3 24259 6.0 WIP 4 14251 8.0 deployed 5 14250 1.0 NaN 6 14250 6.0 WIP 7 14250 5.0 NaN 8 14250 5.0 NaN 9 14250 1.0 NaN

Estoy tratando de obtener el valor máximo para cada identificación. por ejemplo, 14250 debería ser 6.0. 24259 debería ser 6.0.

Id Rank Activity 0 14035 8.0 deployed 1 47728 8.0 deployed 3 24259 6.0 WIP 4 14251 8.0 deployed 6 14250 6.0 WIP

Intenté hacer combined_ranking_df.groupby([''Id''], sort=False)[''Rank''].max() pero el resultado que dataframe fue el primer dataframe (nada cambió).

¿Qué estoy haciendo mal?


IIUC:

In [40]: df.groupby(''Id'', as_index=False, sort=False) / .apply(lambda x: x.nlargest(1, [''Rank''])) / ...: .reset_index(level=1, drop=True) Out[40]: Id Rank Activity 0 14035 8.0 deployed 1 47728 8.0 deployed 2 24259 6.0 WIP 3 14251 8.0 deployed 4 14250 6.0 WIP

o una versión más agradable de @piRSquared :

In [41]: df.groupby(''Id'', group_keys=False, sort=False) / .apply(pd.DataFrame.nlargest, n=1, columns=''Rank'') Out[41]: Id Rank Activity 0 14035 8.0 deployed 1 47728 8.0 deployed 3 24259 6.0 WIP 4 14251 8.0 deployed 6 14250 6.0 WIP


Puede crear un índice booleano para verificar si el Rank para un Id determinado es igual a su valor máximo. Luego use indexación booleana para extraer los valores máximos del marco de datos.

La máscara se crea utilizando groupby en Id con la ayuda de transform , que conserva las dimensiones originales del marco de datos.

>>> df[(df[[''Rank'']] == df[[''Id'', ''Rank'']].groupby(''Id'').transform(max)).squeeze().tolist()] Id Rank Activity 0 14035 8 deployed 1 47728 8 deployed 3 24259 6 WIP 4 14251 8 deployed 6 14250 6 WIP


Trate de almacenarlo y luego consulte ese almacenado groupedby

groups = combined_ranking_df.groupby([''Id''], as_index=False, sort=False).max()[[''Id'',''Rank'']]. Id Rank 0 14035 8.0 1 47728 8.0 2 24259 6.0 3 14251 8.0 4 14250 6.0


Opción 1
Lo mismo que la respuesta de @ayhan aquí
Esto responde a la pregunta ordenando el marco de datos que deja el valor máximo en la última posición por grupo ''Id'' . pd.DataFrame.drop_duplicates nos permite mantener el primero o el último de cada grupo. Sin embargo, esta es una coincidencia útil que es muy rápida. No se generaliza para decir los dos primeros por ''Id'' .

df.sort_values(''Rank'').drop_duplicates(''Id'', ''last'') Id Rank Activity 3 24259 6.0 WIP 6 14250 6.0 WIP 0 14035 8.0 deployed 1 47728 8.0 deployed 4 14251 8.0 deployed

Puede ordenar el índice al final

df.sort_values(''Rank'').drop_duplicates(''Id'', ''last'').sort_index() Id Rank Activity 0 14035 8.0 deployed 1 47728 8.0 deployed 3 24259 6.0 WIP 4 14251 8.0 deployed 6 14250 6.0 WIP

opcion 2
groupby e idxmax
Esto es lo que consideraría la forma más idiomática de resolver este problema. La respuesta de @MaxU es la mejor manera de generalizar al mayor n por ''Id'' .

df.loc[df.groupby(''Id'', sort=False).Rank.idxmax()] Id Rank Activity 0 14035 8.0 deployed 1 47728 8.0 deployed 3 24259 6.0 WIP 4 14251 8.0 deployed 6 14250 6.0 WIP