Dicas de Limpeza de Dados CSV para Analistas e Desenvolvedores
Arquivos CSV são o formato universal de troca de dados tabulares. São simples, legíveis por humanos e suportados por todas as ferramentas, do Excel ao pandas. Mas arquivos CSV do mundo real são frequentemente bagunçados — codificações inconsistentes, valores ausentes, tipos de dados misturados e linhas malformadas. Este guia cobre técnicas práticas para limpar dados CSV de forma confiável.
Problemas Comuns em CSV
1. Problemas de Codificação
O problema mais frustrante em CSV é a codificação. Um arquivo criado no Windows no Excel pode usar windows-1252, enquanto seu script Python espera utf-8.
Sintomas: Caracteres ilegíveis (mojibake) como é em vez de é, ou exceções UnicodeDecodeError.
Detecção:
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
print(result) # {'encoding': 'Windows-1252', 'confidence': 0.73}
Correção: Leia com a codificação detectada e salve como UTF-8:
import pandas as pd
df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)
2. Delimitadores Inconsistentes
Nem todos os "CSVs" usam vírgulas. Arquivos CSV europeus frequentemente usam ponto e vírgula porque vírgulas são separadores decimais em muitas localidades europeias.
# Auto-detectar delimitador
import csv
with open('data.csv', 'r') as f:
dialect = csv.Sniffer().sniff(f.read(5000))
print(f"Delimitador: {repr(dialect.delimiter)}")
Nosso Editor CSV detecta delimitadores automaticamente — cole seus dados e ele identifica o formato.
3. Valores Ausentes
Dados ausentes aparecem de muitas formas: células vazias, NA, N/A, null, -, ou apenas espaços em branco.
# Padronizar todas as representações de valores ausentes
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])
# Verificar valores ausentes por coluna
print(df.isnull().sum())
# Estratégia 1: Remover linhas com campos críticos ausentes
df = df.dropna(subset=['email', 'name'])
# Estratégia 2: Preencher com padrões
df['country'] = df['country'].fillna('Desconhecido')
# Estratégia 3: Preenchimento progressivo (séries temporais)
df['price'] = df['price'].ffill()
4. Linhas Duplicadas
Duplicatas exatas são fáceis de encontrar. Duplicatas aproximadas (mesma pessoa com grafia levemente diferente) são mais difíceis.
# Encontrar duplicatas exatas
duplicates = df[df.duplicated(keep=False)]
print(f"Encontradas {len(duplicates)} linhas duplicadas")
# Remover duplicatas, mantendo a primeira ocorrência
df = df.drop_duplicates()
# Remover duplicatas baseadas em colunas específicas
df = df.drop_duplicates(subset=['email'], keep='last')
5. Formatos de Dados Inconsistentes
Datas em formatos mistos, telefones com e sem código de país, capitalização inconsistente:
# Padronizar datas
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)
# Padronizar campos de texto
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
# Padronizar números de telefone (básico)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)
6. Problemas de Tipo de Dados
CSV armazena tudo como texto. Números com zeros à esquerda, CEPs e telefones podem perder formatação ao serem parseados:
# Preservar zeros à esquerda em CEPs
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})
# Converter strings de moeda para números
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)
Validação Após Limpeza
Sempre valide seus dados limpos:
# Verificar contagem de linhas (perdemos ou ganhamos linhas inesperadamente?)
print(f"Linhas: {len(df)}")
# Verificar tipos de dados
print(df.dtypes)
# Verificar faixas de valores
print(df.describe())
# Verificar nulos restantes
print(df.isnull().sum())
# Validar restrições de unicidade
assert df['email'].is_unique, "E-mails duplicados encontrados!"
Ferramentas de Linha de Comando
Para limpeza rápida sem escrever código:
# Converter codificação
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv
# Ordenar e remover linhas duplicadas
sort -u input.csv > output.csv
# Extrair colunas específicas (cut)
cut -d',' -f1,3,5 input.csv > output.csv
# Filtrar linhas (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv
Para transformações mais complexas, ferramentas como csvkit fornecem um conjunto completo de utilitários CSV:
# Instalar
pip install csvkit
# Ver nomes das colunas
csvcut -n data.csv
# Filtrar linhas
csvgrep -c country -m "USA" data.csv > usa_only.csv
# Converter para JSON
csvjson data.csv > data.json
Convertendo entre CSV e JSON? Nosso conversor CSV para JSON faz isso instantaneamente.
FAQ
Qual é o tamanho máximo de arquivo para processamento CSV?
Não há limite inerente no formato CSV. O limite prático depende das suas ferramentas: Excel lida com cerca de 1 milhão de linhas, pandas funciona bem até vários GB com RAM adequada, e ferramentas como Dask ou Polars lidam com conjuntos de dados maiores que a memória. Para ferramentas baseadas em navegador, nosso editor CSV lida com arquivos de até 100MB.
Devo usar CSV ou JSON para troca de dados?
CSV é melhor para dados planos e tabulares (planilhas, exportações de banco de dados, listas simples). JSON é melhor para dados aninhados e hierárquicos (respostas de API, configuração, documentos com estrutura variável). Para uma comparação detalhada, veja nosso guia CSV vs JSON vs XML.
Recursos Relacionados
- Editor CSV — Edite e limpe dados CSV no seu navegador
- Guia de Conversão CSV para JSON — Converta entre formatos
- Boas Práticas de Formatação JSON — Trabalhe com a saída JSON