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:
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!
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.
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.
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
Podemos acessar o atributo índice desse DataFrame para visualizar as informações dele.
df.index
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
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.
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.
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
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
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.
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.
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()
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)
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
df_pivot.stack(level=0).columns
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.
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.
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()
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)
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.
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.
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")
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.
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")
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")
df.pivot_table(index=["Estudante"], columns=["Semana", "Tópico"], values="Nota", aggfunc="sum")
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()
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())
E esse objeto também apresenta a estrutura de um MultiIndex.
df.groupby(["Estudante", "Semana", "Tópico"])["Nota"].mean().index
É 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])
Perceba que agora temos exatamente o mesmo resultado que obtivemos com o método 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.
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.
Para acessar outras publicações de Ciência de Dados, clique aqui!
Expert em conteúdos da Hashtag Treinamentos. Auxilia na criação de conteúdos de variados temas voltados para aqueles que acompanham nossos canais.