Descomplicando o GroupBy

Grande parte dos casos em que temos que lidar com manipulação de dados, envolve operações em grupos. Seja uma simples agregação ou uma transformação, constantemente é um componente essencial durante um fluxo de análise. Para realizar essas tarefas, a biblioteca Pandas oferece o groupby, que permite resumir conjuntos de dados.

Entendendo o GroupBy

A função groupby() retorna um objeto do tipo GroupBy que descreve como as linhas do conjunto de dados originais foram divididas.

Toda operação envolvendo o groupby segue os seguintes procedimentos:

  • Separar os dados;
  • Aplicar uma função;
  • Combinar os resultados.
Demonstração dos procedimentos

Perceba na imagem acima que a coluna x é a chave que usamos para separar os dados, as chaves não precisam ser do mesmo tipo e podem assumir outros formatos.

Mão na massa

Para realizar os exemplos abaixo, vamos utilizar o dataset Students Performance in Exams. Esse dataset pode ser obtido no Kaggle e contém informações sobre o desempenho de estudantes em diferentes testes.

O dataset possui as seguintes colunas:

  • gender: sexo do estudante;
  • race /ethnicity: Contém cinco grupos de classificação; 
  • parental level of education: Nível de formação dos país;
  • lunch: Possui dois valores, “standard” e “free/reduced”;
  • test preparation course: Informa se foi realizado um curso preparatório antes das provas;
  • math score: Nota de matemática;
  • reading score: Nota de leitura;
  • writing score: Nota de escrita.
Students Performance in Exams

Funcionamento

E se quiséssemos descobrir a média dos estudantes nos três testes realizados, podemos agrupar os estudantes pelo sexo e aplicar a função mean() .

import pandas as pd

data = pd.read_csv('StudentsPerformance.csv')

grouped = data[['math score', 'reading score', 'writing score']].groupby(data['gender'])
grouped.mean()

Bem simples não? Todas as notas foram agrupadas de acordo com uma chave, nesse caso, gender e logo em seguida, aplicamos a função para calcular a média das notas.

Basicamente, isso que acontece quando você roda o código acima.

Agora, cada grupo está separado.

Logo em seguida, é atribuído cada nota em seu respectivo grupo.

Por fim, é aplicado a função em cada grupo.

Agrupamento com índice hierárquico

O agrupamento não é limitado para apenas uma chave, podemos agrupar usando mais de uma.

grouped_keys = data[['math score', 'reading score', 'writing score']].groupby([data['gender'], data['test preparation course']])
grouped_keys.mean()

Assim sendo, agora temos duas chaves agrupando os dados, portanto temos um índice hierárquico.

Note que o groupby permite melhores visualizações dos dados. Está claro que, em todos os casos, alunos que frequentaram um curso de preparação antes da prova, obtiveram melhores notas.

Quando não sabemos a escala que estamos lidando, calculamos estatísticas descritivas (média, mediana, moda). Uma forma comum de calcular as métricas de estatísticas descritiva, é utilizando a função describe() .

grouped_keys.describe()

Agora temos mais informações sobre o nosso objeto.

Essa tabela contém uma lista de algumas funções que podem ser aplicadas ao GroupBy.

Aplicando funções

Vimos que podemos aplicar algumas funções como mean para realizar a agregações no objeto. Entretanto, em alguns casos, talvez você queira aplicar uma função diferente. Graças a biblioteca Pandas, conseguimos fazer isso usando a função agg().

Para usar suas próprias funções de agregação, passe elas para agg() ou aggregate().

A princípio, agrupei os dados de acordo com race/ethnicity e parental level of education e em seguida calculei a média da nota de matemática para os grupos.

grouped = data.groupby(['race/ethnicity', 'parental level of education'])
grouped_math = grouped['math score']
grouped_math.agg('mean')

Em todos os casos acima, os alunos em que o pais possuem bachelor’s degree ou master’s degree como educação, obtiveram melhores notas.

Selecionando um grupo

É possível selecionar um grupo específico com a função get_group() .

grouped_math.get_group(("group A", "bachelor's degree"))

A primeira coluna informa o índice, enquanto que a segunda contém as ocorrências das notas nos grupos selecionados.

Utilizando a função apply()

Vamos criar nossa própria função que calcula a nota mínima, máxima, média e conta quantos resultados foram encontrados. Porém dessa vez, vamos utilizar o apply().

def stats(group):
return {'min': group.min(), 'max': group.max(), 'count': group.count(), 'mean': group.mean()}

Precisamos criar uma coluna classificando os resultados de acordo com a nota.

bins = [0, 25, 50, 75, 100]
group_names = ['Baixo', 'Razoavel', 'Bom', 'Excelente']
data['categorias'] = pd.cut(data['reading score'], bins, labels=group_names)

Usei a nota de leitura como exemplo, mas pode ser aplicado qualquer outra nota. 

Se dermos uma olhada na coluna categorias, que acabamos de criar, vamos obter o seguinte resultado.

Agora, podemos aplicar o groupby.

data['reading score'].groupby(data['categorias']).apply(stats).unstack()

Veja como temos mais controle dos dados. Poderíamos fazer isso com as outras notas e teríamos um resultado parecido.

De forma resumida, apply()  aplica a função a cada grupo, enquanto que o agg() aplica a função a cada coluna.

Aplicando funções em diferentes colunas

Suponha que você precise aplicar funções em colunas distintas. Fica fácil fazer isso passando um dicionário para a função agg() .

Precisamos especificar o nome das colunas e a função que será aplicada.

grouped = data.groupby(['lunch', 'race/ethnicity'])
grouped.agg({'math score' : 'var', 'reading score' : 'std', 'writing score' : 'mad'})

Agrupamos os dados com lunch e race/ethnicity e passamos três funções para três colunas diferentes.

Conclusão

Vimos que o GroupBy pode nos ajudar a agrupar os dados de maneira eficaz e aplicar funções a cada grupo.

Esse artigo foi apenas uma forma de mostrar como é fácil combinar os dados em diferentes formas. Existem diversas outras maneiras de classificação dos dados com GroupBy. Portanto, encorajo você a procurar outras aplicações dessa função.

Ficou com alguma dúvida ou possui uma sugestão? Coloque nos comentários.

Até a próxima.