Blog

Postado em em 6 de maio de 2024

🐼 Reshaping no Pandas – Pivot, Pivot Table, Stack e Unstack

Aprenda a reorganizar dados em um DataFrame com o Reshaping no Pandas, melhorando a visualização e tornando-a muito mais intuitiva.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

🐼 Reshaping no Pandas – Pivot, Pivot Table, Stack e Unstack

Na aula de hoje, vou falar sobre o Reshaping no Pandas, ou seja, veremos como reorganizar dados em um DataFrame.

A ideia é que você consiga pegar as informações que estão no formato de linha e trazer para o formato de coluna. Ajustar informações repetidas e reorganizar o formato dos dados para ter uma visualização muito mais clara, fácil e intuitiva.

Vou te ensinar o passo a passo dos métodos Pivot, Pivot Table, Stack e Unstack no Pandas, para que você aplique corretamente cada um desses métodos e modifique o DataFrame para torná-lo muito mais claro.

Então, faça o download do nosso material disponível e vem comigo aprender tudo sobre Reshaping no Pandas!

Apresentando a Base de Dados

Para exemplificar cada um desses métodos de reorganização de dados em um DataFrame no Pandas, vamos utilizar a base de dados abaixo como exemplo.

Apresentando a Base de Dados

Essa base de dados apresenta as notas dos alunos em um minicurso de ciência de dados, trazendo as informações sobre o nome do aluno, a categoria da avaliação (Teste ou Projeto), a semana em que estava, o tópico abordado e a nota.

Observe que na coluna de Estudante os nomes dos alunos aparecem repetidos várias vezes, até que passe para um próximo aluno, que também se repetirá por diversas linhas da tabela.

Nesse caso, pode ser mais interessante ter uma única entrada para cada aluno e exibir os dados correspondentes em colunas ao lado. Dessa forma, deixaríamos de ter os dados no formato longo e passaríamos a ter no formato amplo.

Essa é uma situação comum, em que temos um dado sendo repetido diversas vezes em uma coluna, e precisamos reorganizar isso, de forma que esse dado repetido vire um índice, e todos os dados referentes fiquem associados a ele.

Índices e Colunas no Pandas

Quando importamos um arquivo e o abrimos com Pandas, o Pandas automaticamente cria um índice, que começa em zero e aumenta de 1 em 1 até a última linha da base de dados.

df = pd.read_excel("dados/reshaping.xlsx")

df

Índices e Colunas no Pandas

Podemos acessar o atributo índice desse DataFrame para visualizar as informações dele.

df.index

atributo índice

Esse é um RangeIndex criado pelo Pandas ao importar os dados. Ele começa (start) no índice 0 e vai até (stop) o índice 32, sendo que esse último valor é exclusivo, ou seja, na prática teremos até o índice 31. O step indica o incremento do índice.

Da mesma forma, podemos visualizar as informações sobre as colunas do DataFrame chamando o atributo columns.

df.columns

atributo columns

Observe que as colunas também são chamadas de índice (Index).

Então, basicamente, quando fazemos um reshaping, mudamos a forma e a organização da estrutura do DataFrame, estamos mudando quem são os índices (linhas) e as colunas dessa tabela.

Método Pivot do Pandas – Operação Pivot

A primeira forma de realizarmos esse processo de reshaping é com o método Pivot. Uma operação pivot em um DataFrame é uma operação que reorganiza e altera a forma dos dados presentes.

Método Pivot do Pandas – Operação Pivot

O método pivot permite especificar os índices (linhas), colunas e valores a serem exibidos no novo DataFrame.

No exemplo acima, tudo que estava na coluna foo foi convertido como índice, os valores na coluna bar se tornaram as colunas do novo DataFrame, e os dados da coluna baz foram os valores atribuídos.

Dessa forma, a partir do primeiro DataFrame, as colunas foram transformadas para seguir os parâmetros definidos, simplificando a visualização dos dados e evitando repetições indesejadas.

Vamos fazer o mesmo processo para a nossa base de dados de exemplo. Definiremos o nome dos estudantes como índice (index), a Categoria, Semana e Tópico serão as colunas presentes nesse DataFrame, e as Notas serão os valores.

df_pivot = df.pivot(index=["Estudante"], columns=["Categoria", "Semana", "Tópico"], values="Nota")

df_pivot

Método Pivot do Pandas – Operação Pivot

Agora só temos uma entrada para o João e uma para a Maria. As demais informações foram organizadas em colunas.

A apresentação das informações ainda não está a mais clara possível, isso porque nossas colunas estão organizadas em 3 níveis diferentes. O primeiro referente à categoria, o segundo à semana e o último ao tópico da aula.

Podemos chamar os atributos índice e columns novamente para visualizarmos essas mudanças.

df_pivot.index

df_pivot.columns

atributos índice e columns

Perceba que nosso índice agora é do tipo objeto e tem os valores de João e Maria, com o nome da coluna índice sendo de Estudante, conforme definimos.

As colunas, por sua vez, apresentam agora um MultiIndex. Observe que os valores referentes a esse MultiIndex são organizados em uma lista de tuplas, associando cada um dos níveis existentes dentro das colunas.

Método Stack do Pandas

Note que, apesar de termos resolvido o problema inicial, onde tínhamos um formato longo com a repetição dos nomes dos estudantes, agora temos um problema referente a essa sequência horizontal, com colunas de múltiplos índices que também dificultam a visualização.

Para corrigirmos esse problema, podemos utilizar o método Stack do Pandas. Esse método transforma colunas de um DataFrame em linhas, subdividindo os índices para melhorar a visualização.

Método Stack do Pandas

Nessa figura acima, inicialmente tínhamos as colunas A e B, após aplicar o método Stack, essas colunas foram transformadas em linhas, criando subdivisões no índice do DataFrame.

No nosso DataFrame, temos várias vezes as colunas Testes e Projetos repetidas. Podemos utilizar o método stack para transformá-las em linhas que irão subdividir o índice do nosso DataFrame.

df_pivot.stack()

Método Stack do Pandas

Repare que o resultado dessa transformação não foi exatamente o que estávamos esperando. Ao invés das colunas referentes a Categoria terem sido reorganizadas como índices, o método stack reorganizou a coluna Tópico.

Isso aconteceu porque, ao utilizarmos o método stack, ele pega por padrão o último nível, que nesse caso era a coluna Tópico. Para definirmos o nível desejado, precisamos passar para ele o parâmetro level.

Como a categoria é o primeiro nível, precisamos definir o valor de level como 0.

df_pivot.stack(level=0)

Método Stack do Pandas

E agora sim temos uma organização mais clara e compreensível dos dados apresentados.

Podemos visualizar agora como estão definidos o índice e as colunas desse DataFrame.

df_pivot.stack(level=0).index

Índice Método Stack do Pandas
df_pivot.stack(level=0).columns

Colunas Método Stack do Pandas

Repare que agora temos a presença do MultiIndex tanto no índice como nas colunas. E nossos dados estão com uma leitura muito mais fácil e clara do que tínhamos inicialmente.

Método Unstack no Pandas

O método Unstack é utilizado para fazer o contrário do método Stack, ou seja, ele pegará um MultiIndex de linhas e passará o nível correspondente para coluna.

Método Unstack no Pandas

Por exemplo, se aplicarmos o método unstack no nosso último DataFrame, ele voltará para a organização anterior dele.

df_pivot.stack(level=0).unstack()

Método Unstack no Pandas

Repare que agora as categorias voltaram a compor o MultiIndex das colunas. No entanto, por padrão, o unstack colocará essa nova coluna como o último nível do MultiIndex.

E do mesmo modo que no stack podemos definir o nível desejado, dentro do unstack também podemos fazer isso. Então, caso quiséssemos atribuir os estudantes como um novo nível das colunas, teríamos de passar o parâmetro level=0.

df_pivot.stack(level=0).unstack(level=0)

Método Unstack no Pandas

Você pode definir também esse level passando apenas o número, ou passando uma string com o nome do índice que você deseja transformar em coluna.

Método Unstack no Pandas

O conceito do MultiIndex nos permite estruturar hierarquicamente os índices nos DataFrames da melhor forma, melhorando a organização, visualização e manipulação dos dados.

Por isso, é muito importante compreender os conceitos e a aplicação do stack e do unstack para configurar os diferentes níveis nas suas bases de dados.

conceitos e a aplicação do stack e do unstack

Pivot Table – Operação de Pivot Table

Também temos uma operação de reorganização e agregação que transforma uma tabela de dados em uma tabela de resumo. Essa operação é a pivot_table, um método muito útil para resumir e reorganizar dados.

A diferença entre pivot e pivot_table é que o pivot_table é um método que envolve agregação, enquanto pivot é uma operação de reorganização.

Vamos compreender melhor a diferença desses métodos na prática. Para começar, vamos observar o erro que ocorre ao remover uma das colunas passadas para o pivot.

df.pivot(index=["Estudante"], columns=["Semana", "Tópico"], values="Nota")

Erro

Ao retirar as categorias das colunas, o pivot não consegue distinguir entre diferentes valores associados a um mesmo aluno em uma semana e tópico específicos, resultando em entradas duplicadas e erros.

Com o Pivot Table, você consegue reorganizar os dados e agregar esses valores simultaneamente. Mas você terá que aplicar junto dela alguma função de agregação como soma ou média dos valores selecionados.

Pivot Table – Operação de Pivot Table

Para o método pivot_table também precisaremos definir um índice, colunas e valores, mas, além disso, precisamos passar a função de agregação (aggfunc). Se você não passar nenhuma função, por padrão ele executará a média.

No exemplo acima, a função de agregação foi definida como soma, então o pivot_table irá somar os valores correspondentes conforme especificados pelos índices e colunas definidos.

A diferença principal entre a operação Pivot e a Pivot Table reside na capacidade desta última de realizar tanto a reorganização quanto a agregação dos dados.

Vamos aplicar a pivot_table no exemplo que obtivemos o erro.

df.pivot_table(index=["Estudante"], columns=["Semana", "Tópico"], values="Nota")

Pivot Table – Operação de Pivot Table

Perceba que agora, mesmo sem as categorias, não obtivemos um erro. E como resultado tivemos um DataFrame com a média das notas de cada estudante por tópico e semana.

Além da média que é calculada por padrão pela Pivot Table sem especificar uma função de agregação, é possível personalizar as operações realizadas através do uso de diferentes funções como contagem ou soma para obter insights específicos.

df.pivot_table(index=["Estudante"], columns=["Semana", "Tópico"], values="Nota", aggfunc="count")

Pivot Table – Operação de Pivot Table
df.pivot_table(index=["Estudante"], columns=["Semana", "Tópico"], values="Nota", aggfunc="sum")

Pivot Table – Operação de Pivot Table

Diferença da Agregação com GroupBy

Geralmente, quando falamos de agregação no Pandas, pensamos no método GroupBy para realizar esses agrupamentos.

Vamos visualizar como poderíamos obter os mesmos resultados numéricos trabalhando com GroupBy.

Para isso, faremos um agrupamento considerando as colunas Estudante, Semana e Tópico, e tiraremos a média a partir da coluna Nota.

df.groupby(["Estudante", "Semana", "Tópico"])["Nota"].mean()

Diferença da Agregação com GroupBy

São os mesmos valores que obtivemos com o método pivot_table. Esse resultado é do tipo série.

type(df.groupby(["Estudante", "Semana", "Tópico"])["Nota"].mean())

GroupBy no Pandas

E esse objeto também apresenta a estrutura de um MultiIndex.

df.groupby(["Estudante", "Semana", "Tópico"])["Nota"].mean().index

GroupBy no Pandas

Transformando GroupBy em DataFrame

É possível transformarmos o resultado do método groupby em um DataFrame utilizando o método unstack.

df.groupby(["Estudante", "Semana", "Tópico"])["Nota"].mean().unstack(level=[1, 2])

Transformando GroupBy em DataFrame

Perceba que agora temos exatamente o mesmo resultado que obtivemos com o método Pivot Table.

Quando usar GroupBy e Pivot Table?

A escolha entre pivot_table e groupby irá depender do usuário. Como vimos acima, pivot_table é uma operação de reorganização e agregação, enquanto o groupby é uma operação de agregação somente.

Se você deseja reorganizar os dados, então o pivot_table é a escolha certa. Já se seu objetivo é apenas agregar os dados e obter os resultados dessa agregação, o groupby será mais indicado.

Além disso, o uso do Pivot Table é mais direto para apresentações finais ou relatórios, enquanto o Group By pode ser mais intuitivo para análises exploratórias.

Conclusão – Reshaping no Pandas – Pivot, Pivot Table, Stack e Unstack

Na aula de hoje, eu te mostrei como utilizar os métodos Pivot, Pivot Table, Stack e Unstack no Pandas para fazer reshaping em seus DataFrames.

Com essas operações aprendidas nessa aula, você conseguirá pegar os dados presentes no seu DataFrame e ajustá-los para melhorar a organização e a visualização deles.

Esses métodos são bastante úteis na análise de dados, tanto para reorganizar e agregar dados para uma apresentação de relatório, como para os processos de análises exploratórias dos dados.

Hashtag Treinamentos

Para acessar outras publicações de Ciência de Dados, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?