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

He frecuentado la función agg() pandas usada para ejecutar estadísticas de resumen en cada columna de un data.frame. Por ejemplo, aquí es 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] ABC 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  mean  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 dataframe 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?

Ver este problema de 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]: BC mean  mean  A group1 11.0 10 101 100 group2 17.5 10 175 100 group3 11.0 10 101 100 

Esto NO es cierto para volver a muestrear, sin embargo, 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)

El documento 0.19.1 de Panda dice “groupby conserva el orden de las filas dentro de cada grupo”, por lo que este es un comportamiento garantizado.

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html

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 diferencia, pero generalmente se debe usar el indicador sort=False :

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

Aún más fácil:

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

salida:

  BC A group1 11.0 101 group2 17.5 175 group3 11.0 101 

Referencia: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

La descripción para el argumento SORT es así:

sort: bool, teclas de grupo True Sort por defecto. Consigue un mejor rendimiento apagando esto. Tenga en cuenta que esto no influye en el orden de las observaciones dentro de cada grupo. Groupby conserva el orden de las filas dentro de cada grupo .