Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Acelerando groupby() com pd.Categorical()

Olá pessoal,

Venho compartilhar uma experiência recente com operações de groupby() no Pandas que estavam extremamente lentas — e como consegui resolver com uma simples mas poderosa transformação: converter a coluna categórica para o tipo Categorical.

Problema inicial

Estava trabalhando com um DataFrame chamado emissoes_por_ano e realizei algumas medições de tempo no Google Colab: Tempos no google colab:

OperaçãoTempo aproximado
emissoes_por_ano.groupby('Gás')0s
emissoes_por_ano.groupby('Gás').groups (0s)0s
emissoes_por_ano.groupby('Gás').get_group('CO2 (t)')1s
emissoes_por_ano.groupby('Gás').sum()+32 minutos (interrompi antes de terminar!)

A última operação (groupby().sum()) estava tão lenta que cheguei a pensar se havia algum erro no código ou no dataset.

Solução aplicada

Pesquisei maneiras de resolver a questão e encontrei uma otimização bem conhecida no mundo do Pandas: converter a coluna "Gás" para o tipo Categorical:

emissoes_por_ano["Gás"] = pd.Categorical(emissoes_por_ano["Gás"])

Essa linha faz uma mudança importante: ela transforma os valores repetidos da coluna "Gás" (como 'CO2 (t)', 'CH4 (t)', etc.) em índices inteiros internos, mantendo uma tabela de rótulos únicos. Isso reduz o uso de memória e acelera comparações e agrupamentos.

Após essa conversão, executei novamente as mesmas operações:

OperaçãoTempo aproximado
emissoes_por_ano.groupby('Gás', observed=True)0s
emissoes_por_ano.groupby('Gás', observed=True).groups0s
emissoes_por_ano.groupby('Gás', observed=True).get_group('CO2 (t)')0s
emissoes_por_ano.groupby('Gás', observed=True)['Emissão'].sum()0s

O resultado foi surpreendente: todas as operações passaram a ser executadas instantaneamente!

Por que isso funciona?

O que é pd.Categorical()?

É uma estrutura do Pandas projetada para lidar com variáveis categóricas — isto é, colunas com poucos valores distintos repetidos, como:

  • "Gás"'CO2 (t)', 'CH4 (t)', etc.
  • "Estado"'SP', 'RJ', 'MG', etc.
  • "Tipo de cliente"'Premium', 'Básico', etc.

Vantagens:

  • Menor consumo de memória
  • Operações mais rápidas (comparação de inteiros é muito mais eficiente que strings)
  • Melhor integração com groupby, merge e join

Dica extra: use observed=True

Ao usar groupby() com colunas categóricas, recomendo sempre adicionar o parâmetro:

.groupby('Gás', observed=True)

Isso evita que o Pandas inclua categorias vazias nos resultados, o que também ajuda na performance e na clareza dos dados.

Comparação com R (factor)

Se você vem do R, talvez já conheça o conceito de factor. No Pandas, pd.Categorical tem comportamento bastante semelhante:

RecursoR (factor)Python (Categorical)
ArmazenamentoInteiros + lista de níveisCódigos + categorias
EficiênciaAltaAlta
Ordenaçãoordered=TRUEordered=True
Funções básicaslevels(), relevel().cat.categories, .cat.reorder_categories()

Então, se você já usou factor() no R, pense em pd.Categorical() como seu equivalente direto no Python.

Em resumo

Se você está enfrentando lentidão com groupby() ou outras operações de agregação:

Considere converter suas colunas categóricas para Categorical

É uma das formas mais simples e eficazes de melhorar a performance do seu código em análise de dados com Pandas.

Abraço!

2 respostas
solução!

Olá, Carlos!

Agradeço por compartilhar sua experiência e a solução que encontrou para otimizar o uso do groupby() no Pandas. Converter colunas categóricas para o tipo Categorical é realmente uma técnica poderosa para melhorar a performance.

No contexto do curso, no qual o foco é agrupar e somar as emissões por tipo de gás, sua dica pode ser extremamente útil para a comunidade Alura. Essa abordagem não só reduz o tempo de execução, mas também otimiza o uso de memória, que é crucial quando se trabalha com grandes volumes de dados.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá, Daniel.

Obrigado pelo retorno e por validar a abordagem - fico feliz em saber que a solução pode ser útil também para outros colegas do curso.

Realmente, o uso de Categorical não só melhorou muito o desempenho da operação, como também me fez refletir sobre a importância de conhecer bem os tipos de dados e suas implicações na performance do código.

Abraço!