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()
# cria um novo dataframe só com compras acima de 30 reais compras_v2 = compras[compras['Valor'] > 30] compras_v2.groupby(['Id'])['Valor'].sum()
compras[compras['Valor'] > 30].groupby(['Id'])['Valor'].sum()
compras[compras.groupby('Id')['Valor'].transform('size') > 1].groupby(['Id'])['Valor'].sum()
nlargest()
# traz as 3 maiores somas compras.groupby(['Id'])['Valor'].sum().nlargest(3)
sum()mean() count()BÔNUS: EVITANDO QUE O PYTHON OCULTE COLUNAS NO DESCRIBEgroupby() groupby()
# 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'))