Cambio de nombre de los nombres de columna en Pandas Groupby función

1). Tengo el siguiente conjunto de datos de ejemplo:

>>> df ID Region count 0 100 Asia 2 1 101 Europe 3 2 102 US 1 3 103 Africa 5 4 100 Russia 5 5 101 Australia 7 6 102 US 8 7 104 Asia 10 8 105 Europe 11 9 110 Africa 23 

Quería agrupar las observaciones de este conjunto de datos por ID y Región y sumr el recuento de cada grupo. Así que usé algo como esto:

 >>> print(df.groupby(['ID','Region'],as_index=False).count().sum()) ID Region count 0 100 Asia 2 1 100 Russia 5 2 101 Australia 7 3 101 Europe 3 4 102 US 9 5 103 Africa 5 6 104 Asia 10 7 105 Europe 11 8 110 Africa 23 

Al usar as_index = False, puedo obtener una salida “similar a SQL”. Mi problema es que no puedo cambiar el nombre de la cuenta agregada de variables aquí. Así que en SQL si quisiera hacer lo anterior, haría algo como esto:

 select ID, Region, sum(count) as Total_Numbers from df group by ID, Region order by ID, Region 

Como vemos, es muy fácil para mí cambiar el nombre de la variable agregada ‘count’ a Total_Numbers en SQL. Quería hacer lo mismo en Pandas, pero no puedo encontrar esa opción en la función de agrupar por. ¿Alguien puede ayudar?

2). La segunda pregunta y más de una observación es que ¿es posible usar directamente los nombres de columna en la función de dataframe de Pandas sin encerrarlos entre comillas? Entiendo que los nombres de las variables son cadenas, por lo que tienen que estar entre comillas, pero veo si usan la función de dataframe externo y como atributo no requerimos que estén entre comillas. Como df.ID.sum (), etc. Es solo cuando lo usamos en una función DataFrame como df.sort () o df.groupby tenemos que usarlo entre comillas. Esto es en realidad un poco molesto, ya que en SQL o en SAS u otros idiomas, simplemente usamos el nombre de la variable sin citarlos. ¿Alguna sugerencia sobre esto?

Por favor sugiera en los dos puntos anteriores (primero uno, segundo más de una opinión).

Gracias

Para la primera pregunta creo que la respuesta sería:

 .rename(columns={'count':'Total_Numbers'}) 

o

 .columns = ['ID', 'Region', 'Total_Numbers'] 

En cuanto al segundo diría que la respuesta sería no. Es posible usarlo como ‘df.ID’ debido al modelo de datos de Python :

Las referencias de atributos se traducen a las búsquedas en este diccionario, por ejemplo, mx es equivalente a m. dict [“x”]

El método actual (a partir de la versión 0.20) para cambiar los nombres de columna después de una operación groupby es encadenar el método de rename . Vea esta nota de desaprobación en la documentación para más detalles.

Respuesta desaprobada a partir de la versión 0.20 de los pandas.

Este es el primer resultado en google y aunque la respuesta principal funciona, en realidad no responde la pregunta. Hay una mejor respuesta aquí y una larga discusión en github sobre la funcionalidad completa de pasar diccionarios al método agg .

Desafortunadamente, estas respuestas no existen en la documentación, pero el formato general para agrupar, agregar y luego renombrar columnas usa un diccionario de diccionarios. Las claves del diccionario externo son nombres de columna que se deben agregar. Los diccionarios internos tienen claves que la nueva columna nombra con valores como la función de agregación.

Antes de que lleguemos allí, vamos a crear un DataFrame de cuatro columnas.

 df = pd.DataFrame({'A' : list('wwwwxxxx'), 'B':list('yyzzyyzz'), 'C':np.random.rand(8), 'D':np.random.rand(8)}) ABCD 0 wy 0.643784 0.828486 1 wy 0.308682 0.994078 2 wz 0.518000 0.725663 3 wz 0.486656 0.259547 4 xy 0.089913 0.238452 5 xy 0.688177 0.753107 6 xz 0.955035 0.462677 7 xz 0.892066 0.368850 

Digamos que queremos agrupar por las columnas A, B y la columna C agregada con mean y median y la columna D agregada con max . El siguiente código haría esto.

 df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'}) DC max mean median AB wy 0.994078 0.476233 0.476233 z 0.725663 0.502328 0.502328 xy 0.753107 0.389045 0.389045 z 0.462677 0.923551 0.923551 

Esto devuelve un DataFrame con un índice jerárquico. La pregunta original se hizo sobre el cambio de nombre de las columnas en el mismo paso. Esto es posible usando un diccionario de diccionarios:

 df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'}, 'D':{'D_max': 'max'}}) DC D_max C_mean C_median AB wy 0.994078 0.476233 0.476233 z 0.725663 0.502328 0.502328 xy 0.753107 0.389045 0.389045 z 0.462677 0.923551 0.923551 

Esto cambia el nombre de las columnas de una sola vez, pero aún así deja el índice jerárquico en el que se puede eliminar el nivel superior con df.columns = df.columns.droplevel(0) .