Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Pandas pivot: colunas para linhas

Bom dia, gente!

Alguem tem alguma ideia de como fazer isso em Pandas? Tentei usar pivot e não consegui.

Eu tenho o seguinte dataframe:

Uf  IBGE    CNES    2020    2021
ES  320120  2547678 2747    2916
ES  320120  2485656 1817    2071
ES  320120  3125416 2965    3156

E preciso que ele fique assim:

Uf  IBGE    CNES    valor   ano
ES  320120  2547678 2747    2020
ES  320120  2485656 1817    2020
ES  320120  3125416 2965    2020
ES  320120  2547678 2916    2021
ES  320120  2485656 2071    2021
ES  320120  3125416 3156    2021

Tks!

1 resposta
solução!

Olá, Tiago, tudo bem?

Na verdade, o que você está querendo fazer é despivotar uma tabela, ou seja, transformá-la de uma versão ampla (espalhando os dados em relação as colunas) para uma versão comprida (espalhando em relação as linhas).

Nesse caso, usamos o método melt(), matendo as colunas Uf, IBGE, CNES e adicionando as colunas com os valores divididos em relação a cada ano (valor e ano).

O método melt() é útil quando queremos moldar nosso DataFrame onde uma ou mais colunas são variáveis identificadoras (id_vars, no nosso caso as colunas Uf, IBGE, CNES), enquanto que outras são consideradas as variáveis medidas (value_vars, no nosso caso as colunas que sobraram 2020 e 2021). Essas duas últimas serão "despivotadas" para as linhas deixando duas colunas chamadas aqui de variable(valor) e value(ano).

Obs.: Antes de utilizar esse método, precisamos resetar o index para que o valor de Uf também seja levado em consideração na nossa análise.

Assim, o código para despivotar essa tabela seria:

# Resetando o index para fazer o Uf ser considerado um id_vars no melt
df.reset_index(inplace=True)

# Fazendo o melt da tabela, as colunas 2020 e 2021 são escolhidas para serem despivotadas
df = df.melt(id_vars = ['Uf', 'IBGE', 'CNES'], value_vars = ['2020', '2021'], var_name='valor', value_name='ano')

#Organizando a tabela para o valor vir antes do ano em questão
df = df[['Uf', 'IBGE', 'CNES', 'valor', 'ano']]
df

Deixando a saída da seguinte forma:

UfIBGECNESvalorano
0ES320120254767827472020
1ES320120248565618172020
2ES320120312541629652020
3ES320120254767829162021
4ES320120248565620712021
5ES320120312541631562021

Espero que tenha respondido a sua dúvida :)

Qualquer dúvida é só chamar!

Abraços e bons estudos!