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
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 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)