Cómo mover datos de pandas de índice a columna después de varios grupos

Tengo el siguiente dataframe de pandas:

In [8]: dfalph.head() Out[8]: token year uses books 386 xanthos 1830 3 3 387 xanthos 1840 1 1 388 xanthos 1840 2 2 389 xanthos 1868 2 2 390 xanthos 1875 1 1 

Agrego las filas con el token duplicado y años así:

 In [63]: dfalph = dfalph[['token', 'year', 'uses', 'books']].groupby(['token', 'year']).agg([np.sum]) dfalph.columns = dfalph.columns.droplevel(1) dfalph.head() Out[63]: uses books token year xanthos 1830 3 3 1840 3 3 1867 2 2 1868 2 2 1875 1 1 

En lugar de tener los campos ‘token’ y ‘year’ en el índice, me gustaría devolverlos a las columnas y tener un índice entero.

Método # 1: reset_index()

 >>> g uses books sum sum token year xanthos 1830 3 3 1840 3 3 1868 2 2 1875 1 1 [4 rows x 2 columns] >>> g = g.reset_index() >>> g token year uses books sum sum 0 xanthos 1830 3 3 1 xanthos 1840 3 3 2 xanthos 1868 2 2 3 xanthos 1875 1 1 [4 rows x 4 columns] 

Método # 2: no haga el índice en primer lugar, usando as_index=False

 >>> g = dfalph[['token', 'year', 'uses', 'books']].groupby(['token', 'year'], as_index=False).sum() >>> g token year uses books 0 xanthos 1830 3 3 1 xanthos 1840 3 3 2 xanthos 1868 2 2 3 xanthos 1875 1 1 [4 rows x 4 columns] 

Aplazamiento de la respuesta aceptada. Si bien hay 2 formas de hacer esto, estas no necesariamente resultarán en el mismo resultado. Especialmente cuando usas Grouper en groupby

  • index=False
  • reset_index()

ejemplo df

 +---------+---------+-------------+------------+ | column1 | column2 | column_date | column_sum | +---------+---------+-------------+------------+ | A | M | 26-10-2018 | 2 | | B | M | 28-10-2018 | 3 | | A | M | 30-10-2018 | 6 | | B | M | 01-11-2018 | 3 | | C | N | 03-11-2018 | 4 | +---------+---------+-------------+------------+ 

No funcionan de la misma manera.

 df = df.groupby( by=[ 'column1', 'column2', pd.Grouper(key='column_date', freq='M') ], as_index=False ).sum() 

Lo anterior dará

 +---------+---------+------------+ | column1 | column2 | column_sum | +---------+---------+------------+ | A | M | 8 | | B | M | 3 | | B | M | 3 | | C | N | 4 | +---------+---------+------------+ 

Mientras,

 df = df.groupby( by=[ 'column1', 'column2', pd.Grouper(key='column_date', freq='M') ] ).sum().reset_index() 

Daré

 +---------+---------+-------------+------------+ | column1 | column2 | column_date | column_sum | +---------+---------+-------------+------------+ | A | M | 31-10-2018 | 8 | | B | M | 31-10-2018 | 3 | | B | M | 30-11-2018 | 3 | | C | N | 30-11-2018 | 4 | +---------+---------+-------------+------------+