Como converter o índice de um dataframe de pandas em uma coluna?

455

Isso parece bastante óbvio, mas não consigo descobrir como converter um índice do quadro de dados em uma coluna?

Por exemplo:

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

Para,

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

Respostas:

762

ou:

df['index1'] = df.index

ou .reset_index:

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

portanto, se você tiver um quadro com vários índices com 3 níveis 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

e você deseja converter o 1º ( tick) e o 3º ( obs) níveis no índice em colunas, você faria:

>>> 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
fonte
4
manter em mente que você tem que fazer isso n vezes para cada índice que você tem (por exemplo, se você tem dois índices, então você tem que fazê-lo duas vezes)
dval
34
Com df.reset_index(level=df.index.names, inplace=True)um pode converter um dado multiindex inteiro em colunas
Venti
2
Você pode ter um índice na coluna que você acabou de adicionar ao quadro de dados, para que seja uma coluna verdadeira E um índice?
Bretcj7
2
Se você quiser converter um multiindex todo, uso apenas df.reset_index(), que se move a totalidade do índice para as colunas (uma coluna por nível) e cria um índice int de 0 a len (df) -1
BallpointBen
2
A atribuição a uma coluna, por exemplo, df['index1'] = df.indexretorna um aviso: "Um valor está tentando ser definido em uma cópia de uma fatia de um DataFrame". Use a função df.assign (), como mostrado abaixo.
John Mark
36

Para o MultiIndex, você pode extrair seu subíndice usando

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

onde si_nameé o nome do subíndice.

Apogentus
fonte
26

Para fornecer um pouco mais de clareza, vejamos um DataFrame com dois níveis em seu índice (um 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'))

insira a descrição da imagem aqui

O reset_indexmétodo, chamado com os parâmetros padrão, converte todos os níveis de índice em colunas e usa um RangeIndexíndice simples como novo.

df.reset_index()

insira a descrição da imagem aqui

Use o levelparâmetro para controlar quais níveis de índice são convertidos em colunas. Se possível, use o nome do nível, que é mais explícito. Se não houver nomes de níveis, você poderá consultar cada nível por seu local inteiro, que começa em 0 a partir do exterior. Você pode usar um valor escalar aqui ou uma lista de todos os índices que deseja redefinir.

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

insira a descrição da imagem aqui

No evento raro em que você deseja preservar o índice e transformá-lo em uma coluna, você pode fazer o seguinte:

# for a single level
df.assign(State=df.index.get_level_values('State'))

# for all levels
df.assign(**df.index.to_frame())
Ted Petrou
fonte
15

rename_axis + reset_index

Você pode primeiro renomear seu índice para um rótulo desejado e elevar para uma série:

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

Isso funciona também para MultiIndexquadros de dados:

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
fonte
4

Se você deseja usar o reset_indexmétodo e também preservar seu índice existente, use:

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

ou para alterá-lo no lugar:

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

Por exemplo:

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

E se você quiser se livrar do rótulo do índice, pode fazer:

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
fonte
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
fonte
5
Gostaria de sugerir a adição de alguma discussão sobre por que você acha que esta resposta é melhor do que respostas existentes ...
dmcgrandle
0

Uma maneira muito simples de fazer isso é usar o método reset_index (). Para um quadro de dados df, use o código abaixo:

df.reset_index(inplace=True)

Dessa forma, o índice se tornará uma coluna e, usando inplace como True, isso se tornará uma mudança permanente.

maria_g
fonte
1
Qual é a diferença dessa resposta da resposta já aceita?
Annosz