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 emsubset=['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 comoTrue, 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:
| Data Original no Arquivo | Plano Mantido | Motivo da Retenção | |
ana@email.com | 18/05/2025 | Premium | Registro mais recente para Ana comparado a 10/02/2025. |
carlos@email.com | 12/10/2026 | Premium Pro | Última atualização cadastral, superando 15/01/2025 e 20/03/2025. |
mariana@email.com | 05/01/2026 | Intermediário | Registro ú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.
