Resposta curta
Aqui está uma função para fazer a codificação one-hot sem usar numpy, pandas ou outros pacotes. É preciso uma lista de números inteiros, booleanos ou strings (e talvez outros tipos também).
import typing
def one_hot_encode(items: list) -> typing.List[list]:
results = []
# find the unique items (we want to unique items b/c duplicate items will have the same encoding)
unique_items = list(set(items))
# sort the unique items
sorted_items = sorted(unique_items)
# find how long the list of each item should be
max_index = len(unique_items)
for item in items:
# create a list of zeros the appropriate length
one_hot_encoded_result = [0 for i in range(0, max_index)]
# find the index of the item
one_hot_index = sorted_items.index(item)
# change the zero at the index from the previous line to a one
one_hot_encoded_result[one_hot_index] = 1
# add the result
results.append(one_hot_encoded_result)
return results
Exemplo:
one_hot_encode([2, 1, 1, 2, 5, 3])
# [[0, 1, 0, 0],
# [1, 0, 0, 0],
# [1, 0, 0, 0],
# [0, 1, 0, 0],
# [0, 0, 0, 1],
# [0, 0, 1, 0]]
one_hot_encode([True, False, True])
# [[0, 1], [1, 0], [0, 1]]
one_hot_encode(['a', 'b', 'c', 'a', 'e'])
# [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 0, 1]]
Resposta longa (er)
Eu sei que já existem muitas respostas para essa pergunta, mas notei duas coisas. Primeiro, a maioria das respostas usa pacotes como numpy e / ou pandas. E isso é uma coisa boa. Se você estiver escrevendo código de produção, provavelmente deverá usar algoritmos robustos e rápidos, como os fornecidos nos pacotes numpy / pandas. Mas, em prol da educação, acho que alguém deve fornecer uma resposta que tenha um algoritmo transparente e não apenas uma implementação do algoritmo de outra pessoa. Segundo, notei que muitas das respostas não fornecem uma implementação robusta da codificação one-hot porque não atendem a um dos requisitos abaixo. Abaixo estão alguns dos requisitos (como eu os vejo) para uma função de codificação one-hot útil, precisa e robusta:
Uma função de codificação one-hot deve:
- manipular lista de vários tipos (por exemplo, números inteiros, strings, flutuadores, etc.) como entrada
- manipular uma lista de entrada com duplicatas
- retorne uma lista de listas correspondentes (na mesma ordem que) às entradas
- retorna uma lista de listas em que cada lista é o mais curta possível
Testei muitas das respostas a esta pergunta e a maioria delas falha em um dos requisitos acima.
drop_first=True
comget_dummies
elimina a necessidade de deixar cair a coluna original separadamente