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

456

Esto parece bastante obvio, pero parece que no puedo entender cómo convertir un índice de marco de datos 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  
msakya
fuente

Respuestas:

763

ya sea:

df['index1'] = df.index

o .reset_index:

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

entonces, si tiene un marco multi-índice 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 desea convertir los niveles primero ( tick) y tercero ( 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
behzad.nouri
fuente
44
tenga en cuenta que tiene que hacer esto n veces para cada índice que tenga (por ejemplo, si tiene dos índices, entonces debe hacerlo dos veces)
dval
34
Con df.reset_index(level=df.index.names, inplace=True)uno se puede convertir un índice múltiple entero dado en columnas
venti
2
¿Puede tener un índice en la columna que acaba de agregar al marco de datos para que sea una columna verdadera Y un índice?
bretcj7
2
Si desea convertir un df.reset_index()índice múltiple completo, simplemente use , que mueve la totalidad del índice a las columnas (una columna por nivel) y crea un índice int de 0 a len (df) -1
BallpointBen
2
La asignación a una columna, por ejemplo, df['index1'] = df.indexdevuelve una advertencia: "Se está intentando establecer un valor en una copia de un segmento de un DataFrame". Utilice la función df.assign () en su lugar, como se muestra a continuación.
John Mark
36

Para MultiIndex puede extraer su subíndice usando

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

donde si_namees el nombre del subíndice.

Apogentus
fuente
26

Para proporcionar un poco más de claridad, echemos un vistazo a 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'))

ingrese la descripción de la imagen aquí

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

df.reset_index()

ingrese la descripción de la imagen aquí

Use el levelparámetro 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 entera, 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)

ingrese la descripción de la imagen aquí

En el raro caso de que desee conservar el índice y convertirlo 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())
Ted Petrou
fuente
15

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 también funciona para MultiIndexmarcos de datos:

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
jpp
fuente
4

Si desea usar el reset_indexmétodo 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 lo siguiente:

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
bunji
fuente
2
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
Avneesh Hota
fuente
55
Yo sugeriría la adición de una cierta discusión sobre por qué cree que esta respuesta es mejor que las respuestas existentes ...
dmcgrandle
0

Una forma muy sencilla de hacerlo es usar el método reset_index (). Para un marco de datos df, use el código a continuación:

df.reset_index(inplace=True)

De esta forma, el índice se convertirá en una columna, y al usar inplace como True, se convertirá en un cambio permanente.

maria_g
fuente
1
¿En qué se diferencia esta respuesta de la respuesta ya aceptada?
Annosz