Group By no Python + Group By com Base Filtrada

O termo group by é muito popular para quem trabalha com base de dados. Quando temos repetições para o elemento chave e queremos fazer um resumo, um agrupamento, é esse o comando a ser utilizado. Um exemplo clássico é quando você tem os dados dos gastos feitos por clientes de uma loja e sua base contém um gasto por linha. Para obter o total gasto por cada cliente, você irá recorrer ao group by.

No Python, quando temos um dataframe da biblioteca Pandas, podemos chamar o comando pelo seu nome e utilizando a sintaxe mais clássica da linguagem que é o nome do objeto (o dataframe) seguido de group by e da função que deve ser aplicada (como a média ou a soma). Vejamos o exemplo da base com os gastos de cada cliente:

# carrega biblioteca pandas

import pandas as pd

# cria dataset
compras = {'Id': ['AA2930','AA2930','CC2139','CC2139','CC9999','AA2930'],
'Data': ['2019-01-01','2019-01-30','2019-01-30','2019-02-01','2019-02-20','2019-03-15'],
'Valor': [200,100,400,150,10,25]
}

compras = pd.DataFrame(compras, columns = ['Id','Data','Valor'])

# traz a soma de gastos de cada cliente (Id)

compras.groupby(['Id'])['Valor'].sum()

Veja que primeiro carregamos a biblioteca pandas a qual vamos nos referir com a abreviação pd, criamos um dataframe e, em seguida, somamos o campo Valor, agrupando-o por cada Id. Poderíamos ter obtido o gasto médio de cada cliente trocando mean() por sum():

compras.groupby(['Id'])['Valor'].mean()

Agora, imagine que por algum motivo você queira fazer um agrupamento utilizando uma tabela com algum filtro. Por exemplo, você quer trazer o gasto médio por cliente mas sem considerar compras que para sua loja são irrisórias, como as que são abaixo de 30 reais. Neste caso, é intuitivo: você deve fazer o comando de filtro normalmente e na frente dele você deve incluir o comando de agrupamento. Veja primeiro como seria fazendo um passo por vez:

# cria um novo dataframe só com compras acima de 30 reais

compras_v2 = compras[compras['Valor'] > 30]

compras_v2.groupby(['Id'])['Valor'].sum()

Para economizar linhas de código, podemos simplesmente colocar tudo em uma única linha:

compras[compras['Valor'] > 30].groupby(['Id'])['Valor'].sum()

De forma análoga, você pode querer trazer somente clientes que fizeram mais de uma compra na sua loja. Ou seja, você vai fazer o group by somente com os clientes que aparecem mais de uma vez na sua base:

compras[compras.groupby('Id')['Valor'].transform('size') > 1].groupby(['Id'])['Valor'].sum()

Você pode ainda, caso sua base seja muito grande, trazer somente as maiores somas (ou médias) com o comando nlargest():

# traz as 3 maiores somas
compras.groupby(['Id'])['Valor'].sum().nlargest(3)

Se quiser, troque sum() e mean() por outras funções como count(), de acordo com a sua necessidade.

BÔNUS: EVITANDO QUE O PYTHON OCULTE COLUNAS NO DESCRIBE

Em alguns momentos, com bases grandes, você pode tentar utilizar o describe combinado com o groupby() e o Python irá ocultar diversas colunas, atrapalhando sua análise. Para que isso não ocorra, antes do groupby() você precisa declarar que não há limite para o que será mostrado:

# Retira limite de colunas a serem mostradas

pd.options.display.max_columns = None

# exemplo de describe com todas variáveis

print(df.groupby('agrupamento_qualquer').describe(include='all'))

E se você gostou do post, não vá embora sem deixar uma curtida ou um comentário. Eu sei que não parece relevante, mas faz diferença para mim e custa pouco para você. Se encontrou algum erro ou tem alguma sugestão, dúvida, elogio ou crítica, pode escrever nos comentários ou me enviar uma mensagem diretamente em Sobre o Estatsite. E visite também a conta do Twitter @EstatSite.

Forte abraço e bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *