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