SQL vs Pandas - Convertendo linhas em colunas
Ao trabalhar com dados é comum ser necessário várias transformações para atingir um determinado objetivo. Neste artigo vamos ver como transformar linhas em colunas. Cada elemento distinto de uma determinada coluna da linha será transformado numa coluna. Você verá formas de como fazer isso utilizando o Pandas e o SQL, vamos comparar como resolver este tipo de problema nos dois.
Os dados que serão utilizados neste artigo seguem a seguinte estrutura:
DATA * DEPARTAMENTO * TIPO_DESPESA * VALOR
2017-01-04 * COMPRAS * CADEIRA * 200
2017-01-06 * MKT * VENTILADOR * 100
2017-01-08 * EXPEDICAO * MATERIAL ESCRITORIO * 300
2017-01-10 * TI * COMPUTADOR * 1200
2017-01-15 * COMPRAS * MESA * 300
2017-01-17 * MKT * CORTINA * 100
2017-01-18 * MKT * TAPETE * 100
2017-01-18 * EXPEDICAO * TELEFONE * 80
2017-01-21 * TI * CABO DE REDE * 300
2017-02-01 * COMPRAS * IMPRESSORA * 500
2017-02-01 * MKT * TV * 1200
Nos registros que vamos utilizar como exemplo existem quatro colunas, data, departamento, tipo de despesa e valor. Existem quatro departamentos, que são Compras, Mkt, Expedição e TI. Ao todo temos 11 registro em nossa tabela de testes. Após a transformação das linhas em colunas, vamos ter como resultado apenas uma linha e quatro colunas, uma coluna para cada departamento.
Vamos começar pelo Pandas. Primeiro vamos criar o nosso dataframe:
import pandas as pd
dataframe = pd.DataFrame({"data": ["2017-01-04", "2017-01-06", "2017-01-08", "2017-01-10", "2017-01-15", "2017-01-17", "2017-01-18", "2017-01-18", "2017-01-21", "2017-02-01", "2017-02-01"], "departamento": ["COMPRAS", "MKT", "EXPEDICAO", "TI", "COMPRAS", "MKT", "MKT", "EXPEDICAO", "TI", "COMPRAS", "MKT"], "tipo_despesa": ["CADEIRA", "VENTILADOR", "MATERIAL ESCRITORIO", "COMPUTADOR", "MESA", "CORTINA", "TAPETE", "TELEFONE", "CABO DE REDE", "IMPRESSORA", "TV"], "valor": [200, 100, 300, 1200, 300, 100, 100, 80, 300, 500, 1200] })
print(dataframe)
Para fazer a transformação de linhas em colunas utilizando o Pandas, nós utilizamos um método chamado pivot_table. Este método vai receber quatro parâmetros, que são:
1 - O dataframe que será utilizado.
2 - A nome da coluna que possui os valores que serão exibidos na linha. (values)
3 - O nome da coluna que possuir os valores que serão transformados em coluna. (columns)
4 - A função de agregação a ser utilziada sobre os valores da linha. (aggfunc)
Em nosso exemplos, os valores que vamos somar ficam na coluna valores, e o conteúdo da coluna departamento deve ser utilizado para criar uma coluna para cada departamento distinto informado em nossa tabela.
Nosso código ficará da seguinte forma:
table = pd.pivot_table(dataframe, values=\'valor\', columns=["departamento"], aggfunc="sum")
print(table)
Vamos ver um segundo exemplo de conversão de linhas em colunas. Em nosso dados, você pode ver que no campo data temos registros referentes aos meses de janeiro e fevereiro do mesmo ano. Vamos repetir o mesmo agrupamento, mas antes vamos criar uma coluna para guardar o mês de cada registro. Para fazer isso usamos o método DatetimeIndex do Pandas.
dataframe["mes"] = pd.DatetimeIndex(dataframe[\'data\']).month
Com o mês criado, podemos usar novamente o método pivot_table do Pandas. Nosso código ficará da seguinte forma:
table2 = pd.pivot_table(dataframe, values=\'valor\', columns=["departamento"], index=["mes"], aggfunc="sum", fill_value=0)
print(table2)
Comparando com o primeiro código que fizemos, houve o acréscimo de dois novos parâmetros. O parâmetro index se refere a coluna que será utilizada como linha, e o parâmetro fill_value informa qual o valor que deve ser utilizado se a coluna criada não tiver valores.
A seguir vamos ver como podemos transformar linhas em colunas utilizando o SQL.
Existem várias formas de fazer isso. No SQL Server podemos usar o comando PIVOT
SELECT (colunas que eu quero utilizar da consulta de referência)
FROM
(consulta de referência que vai trazer os dados desejados) alias_desta_consulta
PIVOT (Função de Agrupamento e nome das colunas que serão criadas pelo agrupamento)
Já no MySQL podemos usar CASE junto com funções de agrupamento.
SELECT
CASE WHEN nome_da_coluna = valor THEN funcao_de_agrupamento(nome_da_coluna_valor) ELSE 0 END AS alias,
(... outras colunas...)
FROM minha_tabela
WHERE (criterios)
GROUP BY nome_da_coluna
Veja nos artigos a seguir como podemos fazer isso nos bancos de dados SQL Server e MySQL
Convertendo linhas em colunas no SQL Server usando PIVOT
Convertendo linhas em colunas usando MySQL
ENCERRAMENTO
Neste artigo você viu como transformar linhas em colunas utilizando o Pandas e o SQL.
Se você se interessou pela comparação do Pandas com o SQL, não deixe de conferir os artigos anteriores:
SQL vs Pandas - Operações Básicas
SQL vs Pandas - Operações Básicas parte 2
SQL vs Pandas - Manipulando strings
SQL vs Pandas - Agrupamento e frequências
SQL vs Pandas - média, mediana e quartis
SQL vs Pandas - Criando um ranking