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!