A base de todo projeto de ciência de dados bem-sucedido é dados limpos e consistentes. No entanto, no acelerado processo de análise, mesmo usuários experientes de Python às vezes tropeçam em armadilhas evitáveis de pré-processamento de dados. Quer você esteja preparando dados para um modelo de aprendizado de máquina ou para visualização, saber quais erros observar pode economizar inúmeras horas de frustração e levar a resultados muito mais robustos.
Vamos destrinchar cinco dos erros de limpeza de dados mais comuns (e frequentemente fatais) em Python, acompanhados de dicas práticas e exemplos ilustrativos para que você possa manter seus fluxos de trabalho sólidos e eficientes.
Um dos primeiros problemas que você encontrará em qualquer conjunto de dados do mundo real é a ausência de dados.
Em Python, especialmente com ferramentas como pandas, substituir ou remover NaNs é fácil: df.dropna() ou df.fillna(0) fazem isso em uma linha. Mas fácil não significa correto.
Descartar linhas com valores ausentes automaticamente pode reduzir drasticamente seu conjunto de dados ou — como em casos em que a ausência está correlacionada — introduzir viés. Preencher valores com a média ou com zero pode distorcer as distribuições, especialmente em colunas não numéricas ou aquelas com outliers.
Considere o seguinte trecho:
# Too hasty with missing value treatment
import pandas as pd
df = pd.read_csv('survey.csv')
df = df.dropna() # Danger: goodbye valuable data!
Se 30% das linhas estiverem ausentes apenas em um único campo opcional — por exemplo, idade — você perderia 30% de seus dados. Se as idades ausentes estiverem principalmente em um grupo demográfico específico, o resultado é um conjunto de dados que não representa mais com precisão a população.
df.isnull().sum() ou df.info() para ver padrões de valores ausentes.sklearn.impute.SimpleImputer para preenchimento informado, ou lógica específica do domínio.
Dados obtidos de várias fontes raramente se encaixam em um único formato. Datas, categorias e codificações de strings são especialmente propensas a erros sutis e difíceis de rastrear.
Problema clássico do Python:
# Date times imported as strings, causing issues
import pandas as pd
df = pd.read_csv('sales.csv')
df['created_at'].min() # Only finds the minimum string, not chronological min
df.dtypes rapidamente expõe colunas que deveriam ser numéricas, mas não são.pd.to_datetime(), pd.to_numeric(), e conversões de categorias assim que importar os dados..str.lower().str.strip() para colunas de categoria; substitua sinônimos ou erros de digitação por um valor consistente.encoding (encoding='utf-8' ou encoding='cp1252').df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df = df.dropna(subset=['created_at']) # Remove linhas onde datas não puderam ser analisadas
Um pouco de atenção aqui evita horas de depuração de análises estranhas mais tarde.
Outliers são os coringas da limpeza de dados — às vezes indicam erros de entrada de dados; outras vezes, são exatamente os eventos que valem ser estudados!
Scripts automatizados que eliminam valores fora de um determinado intervalo sem considerar o contexto podem remover tanto erros quanto sinais importantes.
# Don't just drop anything >200 without context
bp_outliers = df[df['blood_pressure'] > 200]
print(bp_outliers) # Investigate: are these errors or medically relevant cases?
df.describe() e visualizações como box plots ou histogramas para revelar detalhes da distribuição e identificar outliers.Quando os outliers acabarem sendo válidos, podem remodelar as percepções de negócio orientadas pelos dados.
Dados duplicados são onipresentes — erros de entrada de dados, web scraping ou falhas do sistema os introduzem. Enquanto o Python permite df.drop_duplicates() num instante, o perigo real está em entender de onde vêm os duplicados ou como melhor resolvê-los.
Um banco de dados de varejo pode ter várias linhas para o mesmo pedido de cliente devido a envios repetidos do sistema. Excluir todas menos uma linha funciona apenas se todas as colunas corresponderem; caso contrário, informações podem ser perdidas.
# Problematic: Dropping all duplicates based only on 'order_id'
df = df.drop_duplicates(subset=['order_id']) # Could lose different addresses or notes attached to split-row orders
Se colunas como 'delivery_notes' diferirem entre linhas, descartar duplicatas cegamente pode perder dados ou não reconciliar informações conflitantes.
df.duplicated(subset=key_cols, keep=False) para sinalizar duplicatas reais.is_duplicate para análise subsequente é preferível à remoção direta.Aqui está como você pode agregar campos potencialmente úteis antes da deduplicação:
def collapse_order_notes(notes):
return '; '.join(sorted(set(x for x in notes if pd.notnull(x))))
rollup = df.groupby('order_id').agg({
'customer_id': 'first',
'total_amount': 'sum',
'delivery_notes': collapse_order_notes
}).reset_index()
Isso protege dados auxiliares importantes.
Muitos algoritmos poderosos exigem entradas numéricas, não rótulos de string diretos ou categorias. Codificar colunas categóricas é uma etapa crucial, mas apressar ou escolher o método errado pode degradar o desempenho do modelo e introduzir bugs.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label encoding ignores category meaning
le = LabelEncoder()
df['city_code'] = le.fit_transform(df['city']) # Problem: Model interprets numbers mathematical
0,1,2) apenas se os rótulos tiverem uma ordem natural (por exemplo, tamanho: P < M < G). Caso contrário, opte por one-hot ou outras encodificações.pd.get_dummies(df, drop_first=True, dummy_na=False), ou para recursos de alta cardinalidade, considere hashing ou codificação de alvo.fit/transform do sklearn) para que a implantação do modelo obtenha mapeamentos idênticos — uma armadilha clássica quando novas categorias, não vistas, aparecem em entradas do mundo real.city_counts = df['city'].value_counts()
# Only encode cities appearing at least 10 times
common_cities = city_counts[city_counts > 10].index
df['city'] = df['city'].apply(lambda x: x if x in common_cities else 'Other')
df = pd.get_dummies(df, columns=['city'], drop_first=True)
Isso mantém o tamanho das features prático e os modelos robustos.
A limpeza de dados em Python requer respeito tanto pelos detalhes sutis quanto pela velocidade. Ao evitar limpezas mecânicas ou desprovidas de contexto, você eleva seu trabalho de ciência de dados e analytics muito acima da média. Revise os valores ausentes com intenção, traga consistência aos formatos, trate os outliers como sinais e não apenas ruído, examine duplicatas e pense taticamente sobre codificação de categorias.
Equipado com essas lições e um olhar crítico para seus dados, você passará menos tempo refazendo caminhos, reduzirá erros constrangedores em produção e construirá uma reputação por projetar pipelines de dados em que analistas confiem. E no campo em constante crescimento da ciência de dados, tornar-se a pessoa cujos dados estão verdadeiramente prontos para insights é um verdadeiro superpoder.