Limpeza e Transformação de Dados
Conjuntos de dados reais chegam com dtypes incorretos, valores ausentes e strings confusas. A limpeza torna os agregados confiáveis antes de você mesclar ou modelar.
Busque em todas as páginas da documentação
Conjuntos de dados reais chegam com dtypes incorretos, valores ausentes e strings confusas. A limpeza torna os agregados confiáveis antes de você mesclar ou modelar.
Cartão de referência rápida - pronto para copiar e colar.
import pandas as pd
df = pd.read_csv("raw.csv", dtype={"region": "category"})
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
df["sku"] = df["sku"].str.strip().str.upper()
df = df.dropna(subset=["revenue"])Quando usar isso:
import pandas as pd
import numpy as np
from io import StringIO
raw = """order_id,region,revenue,sku,ordered_at
1, east , $120 , abc-1 , 01/15/2025
2,WEST,340,def-2,2025-01-16
3,EAST,N/A,abc-1,2025-01-17
"""
df = pd.read_csv(StringIO(raw), dtype={"region": "string[pyarrow]"})
# Remover espaços em branco e normalizar chaves de texto
df["region"] = df["region"].str.strip().str.title()
df["sku"] = df["sku"].str.upper()
# Analisar dinheiro e datas
df["revenue"] = (
df["revenue"]
.str.replace("$", "", regex=False)
.str.replace(",", "", regex=False)
.replace("N/A", np.nan)
)
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
df["ordered_at"] = pd.to_datetime(df["ordered_at"], format="mixed", utc=True)
# Imputar com política documentada: mediana por região
df["revenue"] = df.groupby("region", observed=True)["revenue"].transform(
lambda s: s.fillna(s.median())
)
# Remover linhas ainda com chaves críticas ausentes
clean = df.dropna(subset=["order_id", "ordered_at"]).astype({"order_id": "int64"})
print(clean.dtypes)
print(clean)O que isso demonstra:
str para espaços em branco e capitalizaçãoto_numeric(errors="coerce") transformando tokens ruins em NANaN para floats, pd.NA para dtypes anuláveis, ou None em colunas de objeto.astype pode copiar; convert_dtypes() atualiza para tipos de extensão pandas anuláveis.| Tarefa | API |
|---|---|
| Analisar números | pd.to_numeric(..., errors="coerce") |
| Analisar datas | pd.to_datetime(..., utc=True) |
| Limitar outliers | s.clip(lower, upper) |
| Renomear colunas | df.rename(columns={"old": "new"}) |
| Deduplicar linhas | df.drop_duplicates(subset=[...]) |
import pandas as pd
# Prefira Int64 anulável quando NA for possível
df["units"] = pd.array([1, None, 3], dtype="Int64")
# map para substituições de pequeno domínio
df["status"] = df["status"].map({"A": "active", "I": "inactive"})df.dropna(inplace=True) em uma fatia corrompe o pai. Correção: atribua de volta: df = df.dropna().$ e . precisam de regex=False ou escape. Correção: passe regex=False para substituições literais.01/02/2025 é analisado de forma diferente por localidade. Correção: force ISO "%Y-%m-%d" na origem ou use format="mixed" com auditoria."East" e "east " se tornam categorias diferentes antes do strip. Correção: normalize strings antes de astype("category").| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Pandera | Validação de esquema em CI | Limpeza rápida de notebook |
| Great Expectations | Contratos de dados de produção | Limpeza de CSV única |
Polars with_columns | Grandes pipelines lazy | Equipe só conhece pandas |
| OpenRefine / SQL | Limpeza com intervenção humana em escala | ETL scriptado e repetível |
dupes = df[df.duplicated("order_id", keep=False)]NaN em vez de gerar erro.dropna ou uma tabela de quarentena para linhas ruins.df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")df[["city", "state"]] = df["location"].str.split(",", expand=True)for chunk in pd.read_csv("huge.csv", chunksize=100_000):
process(chunk)Q3 + 1.5*IQR - marque, não remova silenciosamente sem revisão.pd.NA é o valor ausente escalar do pandas para dtypes de extensão anuláveis.np.nan é o valor ausente de float - propaga em colunas float.df["revenue"].isna().sum() == 0 após a política.Versões da Stack: Esta página foi escrita para Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026