multiple groupby examples example columns agg python pandas aggregate

examples - Python Pandas: ¿Se conserva la orden al usar groupby() y agg()?



python group by agg (4)

He frecuentado la función agg() pandas usada para ejecutar estadísticas de resumen en cada columna de un data.frame. Por ejemplo, aquí está cómo produciría la media y la desviación estándar:

df = pd.DataFrame({''A'': [''group1'', ''group1'', ''group2'', ''group2'', ''group3'', ''group3''], ''B'': [10, 12, 10, 25, 10, 12], ''C'': [100, 102, 100, 250, 100, 102]}) >>> df [output] A B C 0 group1 10 100 1 group1 12 102 2 group2 10 100 3 group2 25 250 4 group3 10 100 5 group3 12 102

En ambos casos, no importa el orden en que se envíen filas individuales a la función agg. Pero considere el siguiente ejemplo, que:

df.groupby(''A'').agg([np.mean, lambda x: x.iloc[1] ]) [output] mean <lambda> mean <lambda> A group1 11.0 12 101 102 group2 17.5 25 175 250 group3 11.0 12 101 102

En este caso, la lambda funciona según lo previsto, dando salida a la segunda fila en cada grupo. Sin embargo, no he podido encontrar nada en la documentación de los pandas que implique que se garantiza que esto sea cierto en todos los casos. Quiero usar agg() junto con una función de promedio ponderado, por lo que quiero estar seguro de que las filas que entran en la función estarán en el mismo orden en que aparecen en el marco de datos original.

¿Alguien sabe, idealmente a través de algún lugar en el código fuente de los documentos o pandas, si este es el caso?


Aún más fácil:

import pandas as pd pd.pivot_table(df,index=''A'',aggfunc=(np.mean))

salida:

B C A group1 11.0 101 group2 17.5 175 group3 11.0 101



Para conservar el orden, deberá pasar .groupby(..., sort=False) . En su caso, la columna de agrupación ya está ordenada, por lo que no hace ninguna diferencia, pero generalmente se debe usar el indicador sort=False :

df.groupby(''A'', sort=False).agg([np.mean, lambda x: x.iloc[1] ])


Ver este issue mejora

La respuesta corta es sí, el groupby conservará los pedidos tal como fueron aprobados. Puede probar esto usando su ejemplo como este:

In [20]: df.sort_index(ascending=False).groupby(''A'').agg([np.mean, lambda x: x.iloc[1] ]) Out[20]: B C mean <lambda> mean <lambda> A group1 11.0 10 101 100 group2 17.5 10 175 100 group3 11.0 10 101 100

Sin embargo, esto NO es cierto para volver a muestrear, ya que requiere un índice monotónico (funcionará con un índice no monotónico, pero lo ordenará primero).

Su es una marca sort= to groupby, pero esto se relaciona con la clasificación de los grupos mismos y no con las observaciones dentro de un grupo.

Para su información: df.groupby(''A'').nth(1) es una forma segura de obtener el segundo valor de un grupo (ya que su método anterior fallará si un grupo tiene <2 elementos)