¿Cómo convertir el índice de un dataframe pandas en una columna?

Esto parece bastante obvio, pero parece que no puedo encontrar la manera de convertir un índice de dataframe en una columna.

Por ejemplo:

df= gi ptt_loc 0 384444683 593 1 384444684 594 2 384444686 596 

A,

 df= index1 gi ptt_loc 0 0 384444683 593 1 1 384444684 594 2 2 384444686 596 

ya sea:

 df['index1'] = df.index 

o, .reset_index :

 df.reset_index(level=0, inplace=True) 

entonces, si tiene un marco de índice múltiple con 3 niveles de índice, como:

 >>> df val tick tag obs 2016-02-26 C 2 0.0139 2016-02-27 A 2 0.5577 2016-02-28 C 6 0.0303 

y quiere convertir los niveles 1º ( tick ) y 3º ( obs ) en el índice en columnas, haría:

 >>> df.reset_index(level=['tick', 'obs']) tick obs val tag C 2016-02-26 2 0.0139 A 2016-02-27 2 0.5577 C 2016-02-28 6 0.0303 

Para MultiIndex puedes extraer su subíndice usando

 df['si_name'] = R.index.get_level_values('si_name') 

donde si_name es el nombre del subíndice.

Para proporcionar un poco más de claridad, veamos un DataFrame con dos niveles en su índice (un MultiIndex).

 index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], ['North', 'South']], names=['State', 'Direction']) df = pd.DataFrame(index=index, data=np.random.randint(0, 10, (6,4)), columns=list('abcd')) 

introduzca la descripción de la imagen aquí

El método reset_index , llamado con los parámetros predeterminados, convierte todos los niveles de índice en columnas y utiliza un RangeIndex simple como nuevo índice.

 df.reset_index() 

introduzca la descripción de la imagen aquí

Utilice el parámetro de level para controlar qué niveles de índice se convierten en columnas. Si es posible, use el nombre del nivel, que es más explícito. Si no hay nombres de nivel, puede referirse a cada nivel por su ubicación de entero, que comienza en 0 desde el exterior. Puede usar un valor escalar aquí o una lista de todos los índices que desea restablecer.

 df.reset_index(level='State') # same as df.reset_index(level=0) 

introduzca la descripción de la imagen aquí

En el caso poco frecuente de que desee conservar el índice y convertir el índice en una columna, puede hacer lo siguiente:

 # for a single level df.assign(State=df.index.get_level_values('State')) # for all levels df.assign(**df.index.to_frame()) 

Si desea usar el método reset_index y también preservar su índice existente, debe usar:

 df.reset_index().set_index('index', drop=False) 

o para cambiarlo en su lugar:

 df.reset_index(inplace=True) df.set_index('index', drop=False, inplace=True) 

Por ejemplo:

 print(df) gi ptt_loc 0 384444683 593 4 384444684 594 9 384444686 596 print(df.reset_index()) index gi ptt_loc 0 0 384444683 593 1 4 384444684 594 2 9 384444686 596 print(df.reset_index().set_index('index', drop=False)) index gi ptt_loc index 0 0 384444683 593 4 4 384444684 594 9 9 384444686 596 

Y si desea deshacerse de la etiqueta de índice puede hacer:

 df2 = df.reset_index().set_index('index', drop=False) df2.index.name = None print(df2) index gi ptt_loc 0 0 384444683 593 4 4 384444684 594 9 9 384444686 596 

rename_axis + reset_index

Primero puede cambiar el nombre de su índice a una etiqueta deseada, luego elevar a una serie:

 df = df.rename_axis('index1').reset_index() print(df) index1 gi ptt_loc 0 0 384444683 593 1 1 384444684 594 2 2 384444686 596 

Esto funciona también para los MultiIndex de MultiIndex MultiIndex:

 print(df) # val # tick tag obs # 2016-02-26 C 2 0.0139 # 2016-02-27 A 2 0.5577 # 2016-02-28 C 6 0.0303 df = df.rename_axis(['index1', 'index2', 'index3']).reset_index() print(df) index1 index2 index3 val 0 2016-02-26 C 2 0.0139 1 2016-02-27 A 2 0.5577 2 2016-02-28 C 6 0.0303 
 df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]}) p = df1.index.values df1.insert( 0, column="new",value = p) df1 new gi ptt 0 0 232 342 1 1 66 56 2 2 34 662 3 3 43 123