Remoção de Duplicatas em Planilhas Mantendo o Registro Mais Recente em Python com Pandas

Remoção de Duplicatas em Planilhas Mantendo o Registro Mais Recente em Python com Pandas

Em rotinas de análise de dados, integração de relatórios e automação de processos de negócios, a presença de registros duplicados em planilhas Excel e arquivos CSV é um dos problemas mais frequentes. Quando sistemas diferentes registram transações de um mesmo cliente, logs de acessos ou atualizações de cadastros em momentos distintos, é comum obter bases de dados poluídas com múltiplas entradas para uma mesma entidade.

A solução ingênua para esse problema consiste em eliminar linhas idênticas de forma arbitrária. Contudo, em cenários operacionais reais, o objetivo raramente é excluir entradas aleatoriamente: busca-se preservar o registro mais recente ou a última atualização válida de cada cadastro, descartando os dados obsoletos.

A biblioteca Pandas em Python oferece um ecossistema extremamente eficiente para essa tarefa. Este guia detalha a arquitetura do método drop_duplicates(), revela a importância crítica da conversão e ordenação de dados temporais e apresenta um fluxo de trabalho passo a passo para tratar e exportar planilhas perfeitamente limpas.

1. A Estrutura do Método drop_duplicates()

O Pandas possui uma função nativa dedicada à eliminação de duplicatas em DataFrames, o método drop_duplicates(). Para utilizá-lo de forma assertiva, é essencial compreender seus três parâmetros fundamentais:

  • subset: Define a coluna ou a lista de colunas que identificam a duplicidade de um registro. Se não for especificado, o Pandas considerará apenas as linhas que forem 100% idênticas em todas as colunas. Para desduplicar clientes por e-mail ou CPF, por exemplo, informamos o nome da coluna correspondente em subset=['email'].
  • keep: Determina qual ocorrência da duplicata deve ser mantida na base de dados:
    • 'first' (padrão): Mantém a primeira ocorrência encontrada no DataFrame e descarta as demais.
    • 'last': Mantém a última ocorrência encontrada no DataFrame e descarta as anteriores.
    • False: Elimina todas as ocorrências que possuírem duplicatas, sem preservar nenhuma delas.
  • inplace: Quando definido como True, altera o DataFrame original diretamente em vez de retornar uma nova cópia tratada.

A Armadilha Comum do Argumento keep='last'

Um erro frequente cometido por analistas é assumir que passar keep='last' no método drop_duplicates() irá automaticamente selecionar o registro com a data mais recente.

O parâmetro keep='last' considera estritamente a posição física das linhas no DataFrame, mantendo a linha que estiver mais abaixo na tabela. Se o seu arquivo CSV ou planilha Excel não estiver estritamente ordenado por ordem cronológica crescente de data, o parâmetro keep='last' poderá manter um dado antigo e apagar a atualização mais recente.

2. A Estratégia em Duas Etapas: Ordenação Prévia e Desduplicação

Para garantir matematicamente que o registro mantido seja o mais recente, o processo deve seguir um fluxo obrigatório de duas etapas: ordenar os dados por data e, em seguida, remover as duplicatas.

   [Dados Brutos Inconsistentes]
                │
                ▼
1. Converter colunas de data para o tipo Datetime (pd.to_datetime)
                │
                ▼
2. Ordenar por Chave e Data em Ordem Crescente (sort_values)
                │
                ▼
3. Aplicar drop_duplicates(subset='Chave', keep='last')
                │
                ▼
   [Base Limpa com Registros Atualizados]

Passo 1: Conversão para o Tipo Datetime

Datas armazenadas em arquivos CSV ou planilhas Excel muitas vezes são lidas pelo Pandas como textos (strings) ou objetos genéricos. A ordenação alfabética de datas em texto como "05/01/2026" e "15/03/2025" falha, pois a comparação alfabética analisa o dia antes do ano.

Antes de qualquer ordenação, deve-se converter a coluna temporal utilizando a função pd.to_datetime().

Passo 2: Ordenação Encadeada com sort_values()

Com a coluna temporal convertida, utiliza-se o método sort_values() especificando a chave de identificação (ex: e-mail) e a coluna temporal. Ao ordenar a coluna de data em ordem crescente (ascending=True), os registros mais antigos ficam acima e os mais recentes ficam localizados no final da tabela.

Ao aplicar drop_duplicates(subset='email', keep='last') logo em seguida, o Pandas irá reter precisamente a linha localizada no final de cada grupo, que corresponde ao registro mais recente.

3. Guia Prático Passo a Passo em Python

Abaixo está a demonstração completa de um script Python simulando uma base de dados de clientes com registros duplicados em datas diferentes, seguido pelo tratamento e pela exportação do resultado limpo para Excel.

import pandas as pd

# 1. Simulação de uma base de dados de clientes com atualizações duplicadas
dados = {
    "cliente_id": [101, 102, 101, 103, 102, 101],
    "nome": ["Carlos Silva", "Ana Souza", "Carlos Silva Jr.", "Mariana Lima", "Ana S. Santos", "Carlos Silva"],
    "email": ["carlos@email.com", "ana@email.com", "carlos@email.com", "mariana@email.com", "ana@email.com", "carlos@email.com"],
    "plano": ["Básico", "Básico", "Premium", "Intermediário", "Premium", "Premium Pro"],
    "data_atualizacao": ["15/01/2025", "10/02/2025", "20/03/2025", "05/01/2026", "18/05/2025", "12/10/2026"]
}

df = pd.DataFrame(dados)

print("--- DATAFRAME ORIGINAL ---")
print(df)

# 2. Conversão da coluna de data para o formato datetime correto
df['data_atualizacao'] = pd.to_datetime(df['data_atualizacao'], format='%d/%m/%Y')

# 3. Ordenação dos dados: Primeiro pela chave (email) e depois pela data (ordem crescente)
df_ordenado = df.sort_values(by=['email', 'data_atualizacao'], ascending=[True, True])

# 4. Remoção de duplicatas mantendo o último registro (o mais recente)
df_limpo = df_ordenado.drop_duplicates(subset=['email'], keep='last')

# 5. Reorganização dos índices do DataFrame
df_limpo = df_limpo.reset_index(drop=True)

print("\n--- DATAFRAME LIMPO (REGISTROS MAIS RECENTES PRESERVADOS) ---")
print(df_limpo)

# 6. Exportação para Excel sem a coluna de índice do Pandas
df_limpo.to_excel("clientes_atualizados.xlsx", index=False, engine="openpyxl")
print("\nArquivo 'clientes_atualizados.xlsx' exportado com sucesso!")

Análise da Tabela do Resultado

Abaixo está o comparativo estrutural entre os dados recebidos originalmente e o resultado final obtido pelo script:

E-mailData Original no ArquivoPlano MantidoMotivo da Retenção
ana@email.com18/05/2025PremiumRegistro mais recente para Ana comparado a 10/02/2025.
carlos@email.com12/10/2026Premium ProÚltima atualização cadastral, superando 15/01/2025 e 20/03/2025.
mariana@email.com05/01/2026IntermediárioRegistro único mantido sem alterações.

4. Boas Práticas para Evitar Falhas na Limpeza de Dados

Para garantir a total confiabilidade do pipeline de sanitização de dados, considere as seguintes recomendações avançadas:

Normalização de Textos e Chaves

Espaços extras em branco ou diferenças entre maiúsculas e minúsculas podem fazer com que o Pandas interprete "carlos@email.com" e "Carlos@email.com " como entidades distintas. Antes de executar o drop_duplicates, padronize as colunas chave:

df['email'] = df['email'].astype(str).str.strip().str.lower()

Tratamento de Rótulos de Índice

Quando linhas são removidas de um DataFrame, os números dos índices originais mantêm suas posições fragmentadas (por exemplo, exibindo as linhas 1, 3 e 5). Ao exportar para formatos como CSV ou Excel, utilize o parâmetro index=False nas funções de exportação (to_excel ou to_csv), ou execute df.reset_index(drop=True) para redefinir a sequência numérica das linhas.

Abordagem Alternativa: Ordenação Decrescente

Outra construção bastante elegante consiste em ordenar a data em ordem decrescente (ascending=False) e utilizar keep='first'. O resultado prático é rigorosamente idêntico:

df_limpo = df.sort_values(by='data_atualizacao', ascending=False).drop_duplicates(subset=['email'], keep='first')

5. Conclusão

Tratar duplicatas mantendo a informação mais recente é um requisito indispensável em auditorias e pipelines de dados. A combinação das funções pd.to_datetime(), sort_values() e drop_duplicates(keep='last') no Pandas resolve o problema com poucas linhas de código, eliminando horas de trabalho manual e riscos de erros operacionais no Excel.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *