Pivot Table em Pandas, explicado

Traduzido do artigo Pandas Pivot Table Explained.

Autor: Chris Moffitt
Data: 2014-12-29

Introdução

A maioria das pessoas certamente tem mais experiência com pivot tables no Excel. Pandas provém uma função similar chamada (apropriadamente) de pivot_table. embora seja extremamente útil, várias vezes esqueço como usar a sintaxe para formatar os resultados de acordo com as minhas necessidades. Esse post irá focar em explicar a função pivot_table do Pandas e como usá-la para sua análise de dados.

Caso não esteja familiarizado com o conceito, a Wikipedia fornece uma explicação em alto nível. A propósito, você sabia que a Microsoft registrou a marca Pivot Table? Eu também não. Desnecessário dizer, irei falar sobre uma pivot table e não sobre PivotTable.

Como bônus extra, criei um guia rápido simples que resume uma pivot_table. Você poderá encontrá-lo ao final desse post e espero que sirva como uma referência útil. Me fale depois se foi útil mesmo.

Os dados

Um dos desafios de usar o pivot_table do pandas é se assegurar que você entende bem os seus dados e as questões que está tentando responder com o pivot table. Pivot table é uma função aparentemente simples mas que pode produzir análises profundas de modo rápido.

Nesse cenário, vou acompanhar um pipeline de vendas (também chamado de funil de vendas). O problema básico é que alguns ciclos de venda são muito longos (por exemplo, software corporativo, equipamento pesado, etc) e a direção quer entender em mais detalhes o que acontece ao longo do ano.

Questões típicas incluem:

  • Quanto temos de receita potencial no pipeline?
  • Quais produtos estão no pipeline?
  • Quem tem quais produtos e em qual estágio?
  • Quais as chances de fechar negócios até o final do ano?

Muitas empresas usam ferramentas de CRM ou outros softwares de acompanhamento do processo de vendas. Ainda que tenham ferramentas úteis para analisar os dados, inevitavelmente alguém vai exportar os dados para o Excel e usar uma pivot table para sumarizá-los.

Usar a pivot table do Pandas pode ser uma boa alternativa:

  • Mais rápida (uma vez instalada)
  • Auto documentável (olhe o código e você saberá o que ela faz)
  • Fácil de usar para gerar relatórios ou emails
  • Mais flexível – você pode definir funções de agregação customizadas

Lendo os dados

Vamos preparar o ambiente primeiro.

Se você quiser acompanhar, baixe o arquivo em Excel:

import pandas as pd 
import numpy as np

Aviso de versão
A API pivot_table tem mudado ao longo do tempo, por isso por favor assegure-se que você tem uma versão recente do pandas (> 0.15) instalada para que esse exemplo funcione. Esse exemplo também usa o tipo de dados categórico o que também requer uma versão recente.

Ler os dados do funil de vendas no nosso DataFrame:

df = pd.read_excel("../in/sales-funnel.xlsx") 
df.head()

Por conveniência, vamos definir a coluna ‘Status’ como uma categoria e determinar a ordem em que queremos ver.

Isso não é estritamente necessário mas vai nos ajudar a manter a ordem que queremos enquanto trabalhamos na análise dos dados.

df["Status"] = df["Status"].astype("category")
df["Status"].cat.set_categories(["won","pending","presented","declined"],inplace=True)

Pivotando os dados

Enquanto construimos a pivot table, creio que o mais fácil é dar uma passo de cada vez. Adicione itens e verifique cada passo para confirmar se está obtendo os resultados esperados. Não fique com receio de manipular a ordem e as variáveis para ver qual apresentação faz mais sentido para suas necessidades.

A pivot table mais simples precisa ter um dataframe e um índice (index). Nesse exemplo, vamos usar Name como índice.

pd.pivot_table(df,index=["Name"])

Você pode ter múltiplos índices também. Na verdade, a maioria dos argumentos de uma pivot table aceita múltiplos valores na forma de uma lista.

pd.pivot_table(df,index=["Name","Rep","Manager"])

Isso é interessante mas não particularmente útil. O que possivelmente precisamos fazer é olhar por gerente (Manager) e por representante (Rep). É fácil fazer isso, alteramos o índice.

pd.pivot_table(df,index=["Manager","Rep"])

Você pode ver que a pivot table é inteligente o bastante para começar a agregar e sumarizar os dados, agrupando os representantes com seus respectivos gerentes. Agora começamos a perceber o que uma pivot table pode fazer por nós.

Para esse fim, as colunas conta (Account) e quantidade (Quantity) não são muito úteis. Vamos removê-las, definindo explicitamente as colunas que queremos usando o campo values.

pd.pivot_table(df,index=["Manager","Rep"],values=["Price"])

A coluna preço (Price) automaticamente tirou a média dos dados, mas podemos obter a contagem ou a soma. Adicioná-los é simples ao usar aggfunc e np.sum.

pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],aggfunc=np.sum)

aggfunc pode receber uma lista de funcões. Vamos tentar a média usando função mean do numpy e len para obter a contagem.

pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],aggfunc=[np.mean,len])

Se quisermos ver as vendas em termos de produtos, a variável colunas (columns) nos permite definir uma ou mais colunas.

Columns vs Values
Creio que um dos pontos de confusão no pivot_table é o uso de columns e values. Lembre-se, columns é opcional – columns dá uma forma adicional de segmentar os valores efetivos que te interessam. As funções de agregação se aplicam aos valores que você listar.

pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],columns=["Product"],aggfunc=[np.sum])

Os valores NaN distraem um pouco. Se quisermos removê-los, podemos usar fill_value e atribuir-lhes o valor 0.

pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],columns=["Product"],aggfunc=[np.sum],fill_value=0)

Creio que seria útil incluir a quantidade também. Adicione Quantity à lista de valores.

pd.pivot_table(df,index=["Manager","Rep"],values=["Price","Quantity"],columns=["Product"],aggfunc=[np.sum],fill_value=0)

O que me chama a atenção é que você pode mover itens para o índice para obter uma representação visual diferente. Remova Product das colunas e adicione ao índice.

pd.pivot_table(df,index=["Manager","Rep","Product"],values=["Price","Quantity"],aggfunc=[np.sum],fill_value=0)

Para esse conjunto de dados, essa representação faz mais sentido. Agora, e se quisermos ver os totais? margins=True faz isso para nós.

pd.pivot_table(df,index=["Manager","Rep","Product"],values=["Price","Quantity"],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)

Vamos incrementar a análise e olhar o nosso pipeline ao nível de gerentes. Note como o status é ordenado com base na nossa definição prévia de categoria.

pd.pivot_table(df,index=["Manager","Status"],values=["Price"],aggfunc=[np.sum],fill_value=0,margins=True)

Uma funcionalidade bem útil é a capacidade de mandar um dicionário para a aggfunc de forma que você possa performar diferentes funções em cada um dos valores selecionados. Isso tem o efeito colateral de deixar os rótulos mais limpos.

pd.pivot_table(df,index=["Manager","Status"],columns=["Product"],values=["Quantity","Price"],aggfunc={"Quantity":len,"Price":np.sum},fill_value=0)

Você pode fornecer uma lista de aggfunctions a ser aplicada a acada valor também:

table = pd.pivot_table(df,index=["Manager","Status"],columns=["Product"],values=["Quantity","Price"],aggfunc={"Quantity":len,"Price":[np.sum,np.mean]},fill_value=0) 
table

Pode parecer desafiador tentar fazer tudo isso de uma vez, mas assim que você começar a brincar com os dados e a adicionar itens, você irá perceber como funciona. Via de regra, uma vez que você começar a usar múltiplos groupby, você deveria reavaliar se a pivot table é realmente uma abordagem útil.

Filtros avançados

Uma vez que você tenha gerado seus dados, eles estão num DataFrame que você pode filtrar usando funções padrão do DataFrame.

Caso queira ver apenas um gerente:

table.query('Manager == ["Debra Henley"]')

Você pode olhar todas as negociações (Deals) pendentes e fechadas.

table.query('Status == ["pending","won"]')

Essa é uma funcionalidade poderosa do pivot_table, então não se esqueça que você tem toda a força do pandas a seu dispor, uma vez que tenha seus dados no formato pivot_table que necessita.

O notebook completo está disponível caso queira salvá-lo como referência.

Guia rápido

Para resumir tudo o que vimos até agora, criei um guia rápido que espero possa ajudá-lo a lembrar como usar o pivot_table do pandas. Dê uma olhada e me fale depois o que achou.

Obrigado e boa sorte em criar suas próprias pivot tables.


Veja também: