Como fazer one-hot encoding de dados categóricos em Python
O one-hot encoding é a forma mais comum de transformar dados categóricos — texto como "azul" ou "vermelho" — em colunas numéricas que um modelo de Machine Learning consegue usar. A maioria dos algoritmos, da regressão às árvores de decisão, só trabalha com números. Se deixarmos as categorias como texto, o treino falha; se as trocarmos por 1, 2 e 3, criamos uma ordem falsa entre elas. O one-hot encoding resolve os dois problemas de uma só vez e é simples de aplicar em Python com o scikit-learn.
Pré-requisitos
- Python 3.8 ou superior instalado.
- As bibliotecas
scikit-learnepandas. - Conhecer o básico de DataFrames do pandas.
- Um conjunto de dados com pelo menos uma coluna de texto (categórica).
Passo 1: Perceber o problema
Imagina uma tabela com uma coluna "cor". Os valores "azul", "verde" e "vermelho" não têm significado matemático, e não podemos simplesmente trocá-los por 1, 2 e 3 — isso faria o modelo pensar que "vermelho" (3) é maior do que "azul" (1), o que não faz sentido. Vamos criar este exemplo:
import pandas as pd
df = pd.DataFrame({
"cor": ["azul", "verde", "vermelho", "azul"],
"preco": [10, 15, 20, 12]
})
print(df)
A coluna cor é categórica; a coluna preco já é numérica e não precisa de tratamento.
Passo 2: Importar o OneHotEncoder
O scikit-learn traz uma classe pronta para esta tarefa: o OneHotEncoder. Se ainda não tens as bibliotecas, instala-as no terminal com pip install scikit-learn pandas. Depois, importa o codificador no teu script:
from sklearn.preprocessing import OneHotEncoder
Passo 3: Aplicar o one-hot encoding
Criamos o codificador e aplicamo-lo à coluna categórica. O parâmetro sparse_output=False devolve um array normal (mais fácil de ler) e handle_unknown="ignore" evita erros se, mais tarde, aparecerem categorias que o codificador não viu no treino.
encoder = OneHotEncoder(sparse_output=False, handle_unknown="ignore")
codificado = encoder.fit_transform(df[["cor"]])
print(codificado)
O método fit_transform faz duas coisas: aprende quais as categorias existentes (fit) e transforma-as em números (transform). O resultado é uma matriz em que cada categoria passa a ser uma coluna com valores 0 ou 1. Cada linha tem um único 1 — daí o nome "one-hot".
Passo 4: Juntar as colunas ao DataFrame
A matriz sozinha é pouco legível. Vamos dar-lhe nomes de colunas com get_feature_names_out() e juntá-la ao DataFrame original, removendo a coluna de texto:
nomes = encoder.get_feature_names_out(["cor"])
df_codificado = pd.DataFrame(codificado, columns=nomes)
resultado = pd.concat([df.drop(columns=["cor"]), df_codificado], axis=1)
print(resultado)
Agora tens um DataFrame totalmente numérico, com colunas como cor_azul, cor_verde e cor_vermelho, pronto para treinar um modelo.
Passo 5: Alternativa rápida com pandas
Para uma exploração rápida, o pandas oferece o get_dummies, que faz o mesmo numa única linha:
resultado_rapido = pd.get_dummies(df, columns=["cor"])
print(resultado_rapido)
É muito prático para análises pontuais. Ainda assim, em projetos de Machine Learning o OneHotEncoder é preferível, porque memoriza as categorias vistas no treino e aplica exatamente as mesmas aos dados de teste, evitando colunas diferentes entre conjuntos. Dica: para evitar redundância entre colunas, podes usar OneHotEncoder(drop="first"), que remove a primeira categoria.
Verificar o resultado
Confirma que o DataFrame final já não tem texto: todas as colunas devem ser numéricas. Deverás ver uma coluna por cada cor distinta, com 0 ou 1 em cada linha. Uma boa verificação é somar cada linha das colunas de cor — o total deve ser sempre 1, porque cada registo pertence a exatamente uma categoria. Testa com df_codificado.sum(axis=1) e confirma que todos os valores são 1.
Conclusão
Acabaste de converter dados categóricos em colunas numéricas com one-hot encoding, usando o OneHotEncoder do scikit-learn e a alternativa get_dummies do pandas. O próximo passo natural é integrar este codificador num Pipeline, para aplicar o pré-processamento e o treino do modelo de uma só vez. Que colunas categóricas existem no teu conjunto de dados que precisam de ser codificadas?