SQL vs Pandas - Convertendo linhas em colunas

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

 

 

Outros conteudos que podem ser de seu interesse

Calculando dias úteis utilizando SQL
03/04/2022SQL

Calculando dias úteis utilizando SQL

Veja como calcular a diferença de dias úteis utilizando SQL

Saiba mais...
Criando uma tabela calendário com SQL
04/02/2024SQL

Criando uma tabela calendário com SQL

Aprenda como criar uma tabela calendário no SQL para controlar dias úteis e feriados

Saiba mais...

Conteúdo sobre banco de dados sem complicação!