¿Cómo encuentro todas las filas en un marco de datos de pandas que tienen el valor máximo para count
columna, después de agrupar por ['Sp','Mt']
columnas?
Ejemplo 1: el siguiente dataFrame, que agrupo por ['Sp','Mt']
:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Salida esperada: obtenga las filas de resultados cuyo recuento es máximo entre los grupos, como:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Ejemplo 2: este marco de datos, que agrupo por ['Sp','Mt']
:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
Para el ejemplo anterior, quiero obtener todas las filas donde count
es igual a max, en cada grupo, por ejemplo:
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
fuente
fuente
1 3
?Respuestas:
Para obtener los índices del DF original, puede hacer:
Tenga en cuenta que si tiene múltiples valores máximos por grupo, todos serán devueltos.
Actualizar
En un granizo, es probable que esto sea lo que solicita el OP:
fuente
idx
enfoque. Pero, solo puedo permitirme un máximo máximo para cada grupo (y mis datos tienen algunos duplicados-max). ¿Hay alguna manera de evitar esto con su solución?transform
El método puede tener un rendimiento de grupo cuando el conjunto de datos es lo suficientemente grande, obtenga el valor máximo primero y luego combinar los marcos de datos será mejor.Puede ordenar el dataFrame por conteo y luego eliminar duplicados. Creo que es más fácil:
fuente
inplace = True
como argumento paradrop_duplicates
La solución fácil sería aplicar: la función idxmax () para obtener índices de filas con valores máximos. Esto filtraría todas las filas con el valor máximo en el grupo.
fuente
"I want to get ALL the rows where count equals max in each group"
, deidxmax
Return[s] index of first occurrence of maximum over requested axis"
acuerdo con los documentos (0.21).Después de haber probado la solución sugerida por Zelazny en un DataFrame relativamente grande (~ 400k filas), me pareció muy lento. Aquí hay una alternativa que encontré para ejecutar órdenes de magnitud más rápido en mi conjunto de datos.
fuente
df[df['count'] == df['count_max']]
perderá filas de NaN, así como las respuestas anteriores.Es posible que no tenga que ver con el grupo usando
sort_values
+drop_duplicates
También casi la misma lógica usando
tail
fuente
Para mí, la solución más fácil sería mantener el valor cuando el recuento es igual al máximo. Por lo tanto, el siguiente comando de una línea es suficiente:
fuente
Uso
groupby
yidxmax
métodos:transferir col
date
adatetime
:obtener el índice
max
de columnadate
, después degroupyby ad_id
:obtener los datos deseados:
Fuera [54]:
fuente
fuente
Al darse cuenta de que "aplicar" "nlargest" a groupby object funciona igual de bien:
Ventaja adicional: también puede obtener los mejores valores n si es necesario:
fuente
Intente usar "nlargest" en el objeto groupby. La ventaja de usar nlargest es que devuelve el índice de las filas de donde se obtuvieron "los elementos más grandes". Nota: dividimos el segundo (1) elemento de nuestro índice ya que nuestro índice en este caso consiste en tuplas (por ejemplo, (s1, 0)).
ingrese la descripción de la imagen aquí
fuente
He estado usando este estilo funcional para muchas operaciones grupales:
.reset_index(drop=True)
lo lleva de vuelta al índice original al soltar el índice de grupo.fuente