alltools.one
Data
2025-07-01
8 min
alltools.one Team
CSVData CleaningData AnalysisETLPython

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

Published on 2025-07-01
CSV Data Cleaning Tips for Analysts and Developers | alltools.one