Transforme o Multi-índice do Pandas em coluna

155

Eu tenho um quadro de dados com 2 níveis de índice:

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

O que eu quero transformar nisso:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Como posso fazer isso da melhor maneira?

Preciso disso porque quero agregar os dados conforme as instruções aqui , mas não posso selecionar minhas colunas assim se estiverem em uso como índices.

TheChymera
fonte
2
Duplicado: stackoverflow.com/questions/18624039/… Você deseja a primeira sugestão. .reset_index()
precisa saber é o seguinte
1
muito obrigado, eu realmente lidos em torno para este muito, mas "make multiindex a coluna" e consultas semelhantes sempre tem me tópicos que queriam rodar seus dataframes ...
TheChymera
3
Sempre mais fácil encontrar uma resposta quando você já sabe que :)
TomAugspurger

Respostas:

192

O reset_index () é um método do DataFrame do pandas que transfere valores de índice para o DataFrame como colunas. A configuração padrão para o parâmetro é drop = False (que manterá os valores do índice como colunas).

Tudo o que você precisa fazer .reset_index(inplace=True)após o nome do DataFrame:

df.reset_index(inplace=True)  
CraigSF
fonte
3
Para o meu caso em que eu tinha três níveis de índice, a redefinição no local não funcionou. Alternativa é atribuir trama de dados recém-resetted para um novo: DF2 = df.reset_index ()
Gorkem
8
Para redefinir apenas um (s) nível (s) específico (s), usedf.reset_index(level=[...])
cs95
20

Isso realmente não se aplica ao seu caso, mas pode ser útil para outras pessoas (como eu 5 minutos atrás). Se o índice múltiplo de uma pessoa tiver o mesmo nome assim:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True) falhará, pois as colunas criadas não podem ter os mesmos nomes.

Então, você precisa renomear o multíndice com df.index = df.index.set_names(['Trial', 'measurement'])para obter:

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

E então df.reset_index(inplace=True)vai funcionar como um encanto.

Encontrei esse problema depois de agrupar por ano e mês em uma coluna de data e hora (não índice) chamada live_date, o que significava que o ano e o mês foram nomeados live_date.

Karl Anka
fonte
1
Como ter seus valores de avaliação para se repetir? Eu tive o mesmo problema e funciona, exceto que meus valores não se repetem.
Ricos
4

Como @ cs95 mencionado em um comentário, para reduzir apenas um nível, use:

df.reset_index(level=[...])

Isso evita a necessidade de redefinir o índice desejado após a redefinição.

sameagol
fonte