Al realizar un filtro en el resultado de una operación grupal de Pandas, devuelve un dataframe. Pero suponiendo que quiero realizar más cálculos grupales, tengo que volver a llamar a groupby, lo que parece una especie de ronda. ¿Hay una forma más idiomática de hacer esto?
EDITAR:
Para ilustrar de lo que estoy hablando:
Robamos sin vergüenza un dataframe de juguetes de los documentos de Pandas, y agrupamos:
>>> dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')}) >>> grouped = dff.groupby('B') >>> type(grouped)
Esto devuelve un objeto groupby sobre el cual podemos iterar, realizar operaciones de grupo, etc. Pero si filtramos:
>>> filtered = grouped.filter(lambda x: len(x) > 2) >>> type(filtered)
Recuperamos un dataframe. ¿Existe una buena forma idiomática de recuperar los grupos filtrados, en lugar de solo las filas originales que pertenecían a los grupos filtrados?
Si desea combinar un filtro y un agregado, la mejor manera que se me ocurra sería combinar su filtro y agregado usando un ternario if
apply
dentro, devolviendo None
a los grupos filtrados, y luego dropna
para eliminar estas filas del resultado final :
grouped.apply(lambda x: x.sum() if len(x) > 2 else None).dropna()
Si desea recorrer los grupos, diga que para volver a unirse a ellos, puede usar un generador de comprensión.
pd.concat(g for i,g in grouped if len(g)>2)
En última instancia, creo que sería mejor si groupby.filter
tuviera la opción de devolver un objeto groupby.