Como remover linhas duplicadas com pandas em Python
Linhas repetidas num DataFrame são um dos problemas mais comuns na limpeza de dados: aparecem quando juntamos vários ficheiros, importamos exportações com erros ou recolhemos os mesmos registos duas vezes. Se não forem removidas, distorcem contagens, médias e relatórios. Felizmente, remover linhas duplicadas com pandas em Python é rápido e seguro graças ao método drop_duplicates, e a seguir vais ver como detetá-las, contá-las e eliminá-las com controlo total.
Pré-requisitos
- Python 3 instalado e o pandas disponível (
pip install pandas). - Saber criar ou carregar um DataFrame (por exemplo, a partir de um CSV).
- Um editor ou notebook, como o Jupyter ou o VS Code, para correr o código.
Passo 1: Criar um DataFrame de exemplo
Para acompanhares sem depender de ficheiros externos, começa por criar um pequeno DataFrame com algumas linhas repetidas de propósito. Repara que a linha da "Ana" no "Porto" aparece exatamente igual duas vezes.
import pandas as pd
df = pd.DataFrame({
"nome": ["Ana", "Bruno", "Ana", "Carla", "Bruno"],
"cidade": ["Porto", "Lisboa", "Porto", "Braga", "Faro"],
"vendas": [100, 200, 100, 300, 250],
})
print(df)
Ao imprimir o DataFrame vais ver cinco linhas, das quais duas são idênticas. Uma linha só conta como duplicada quando todos os valores coincidem com os de outra: basta uma célula diferente para o pandas a considerar única.
Passo 2: Detetar e contar os duplicados
Antes de remover seja o que for, é boa prática ver quantas linhas estão repetidas. O método duplicated() devolve uma série de valores True e False, marcando como True todas as repetições a partir da segunda ocorrência. Detetar antes de apagar evita surpresas, porque ficas a saber quantas linhas vais perder e podes inspecioná-las se for preciso.
# Marca cada linha repetida (exceto a primeira ocorrência)
print(df.duplicated())
# Conta quantas linhas duplicadas existem no total
print(df.duplicated().sum())
No nosso exemplo, apenas a segunda linha da "Ana" é totalmente igual a uma anterior, por isso a contagem devolve 1.
Passo 3: Remover as linhas duplicadas
Para eliminar as repetições, aplica drop_duplicates(). Por predefinição, o pandas mantém a primeira ocorrência e descarta as seguintes. O método devolve um novo DataFrame e não altera o original, por isso guarda o resultado numa variável.
df_limpo = df.drop_duplicates()
print(df_limpo)
Dica: evitainplace=True. Reatribuir o resultado (como emdf_limpo = df.drop_duplicates()) torna o código mais claro e fácil de depurar.
Neste caso o DataFrame passa de cinco para quatro linhas, porque a repetição da "Ana" foi removida e as restantes ficaram intactas.
Passo 4: Escolher que ocorrência manter
O parâmetro keep decide qual das repetições fica. Usa "first" (predefinição) para manter a primeira, "last" para manter a última, ou False para eliminar todas as linhas que tenham duplicados.
# Mantém a última ocorrência de cada duplicado
df.drop_duplicates(keep="last")
# Remove TODAS as linhas que aparecem mais do que uma vez
df.drop_duplicates(keep=False)
Passo 5: Duplicados apenas em certas colunas
Muitas vezes uma linha deve ser considerada duplicada apenas quando certas colunas coincidem, ignorando as restantes. O parâmetro subset aceita uma lista de colunas. No exemplo seguinte, duas linhas são iguais se tiverem o mesmo nome, mesmo que o valor de vendas seja diferente.
# Considera duplicado quando o "nome" se repete
df.drop_duplicates(subset=["nome"])
# Também podes comparar várias colunas ao mesmo tempo
df.drop_duplicates(subset=["nome", "cidade"])
Depois de remover linhas, o índice fica com "buracos" na numeração. Para o reordenar de 0 em diante, acrescenta ignore_index=True.
df.drop_duplicates(subset=["nome"], ignore_index=True)
Verificar o resultado
Para confirmar que já não há repetições, volta a contar os duplicados no DataFrame limpo: o total deve ser 0. Comparar o número de linhas antes e depois também ajuda a perceber quantas foram removidas. Este pequeno teste é útil sobretudo quando corres o mesmo script várias vezes ou quando os dados chegam de fontes diferentes.
print("Antes:", len(df))
print("Depois:", len(df_limpo))
print("Duplicados restantes:", df_limpo.duplicated().sum())
Se vires Duplicados restantes: 0, a limpeza correu como esperado.
Conclusão
Com duplicated() e drop_duplicates() tens tudo o que precisas para encontrar e remover linhas repetidas em pandas, escolhendo que ocorrência manter e que colunas comparar. O passo seguinte é incluir esta limpeza na tua rotina habitual, antes de agrupar dados ou calcular métricas, para garantir números fiáveis. E no teu caso: que colunas definem realmente uma linha "duplicada"?