Respuesta corta
Aquí hay una función para hacer una codificación en caliente sin usar numpy, pandas u otros paquetes. Toma una lista de enteros, booleanos o cadenas (y quizás otros tipos también).
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
Ejemplo:
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]]
Respuesta larga (er)
Sé que ya hay muchas respuestas a esta pregunta, pero noté dos cosas. Primero, la mayoría de las respuestas usan paquetes como numpy y / o pandas. Y esto es algo bueno. Si está escribiendo código de producción, probablemente debería usar algoritmos rápidos y robustos como los que se proporcionan en los paquetes numpy / pandas. Pero, por el bien de la educación, creo que alguien debería proporcionar una respuesta que tenga un algoritmo transparente y no solo una implementación del algoritmo de otra persona. En segundo lugar, me di cuenta de que muchas de las respuestas no proporcionan una implementación robusta de la codificación de uno en caliente porque no cumplen uno de los requisitos a continuación. A continuación se detallan algunos de los requisitos (tal como los veo) para una función de codificación única, útil, precisa y robusta:
Una función de codificación única debe:
- manejar la lista de varios tipos (por ejemplo, enteros, cadenas, flotantes, etc.) como entrada
- manejar una lista de entrada con duplicados
- devolver una lista de listas correspondientes (en el mismo orden que) a las entradas
- devolver una lista de listas donde cada lista es lo más corta posible
Probé muchas de las respuestas a esta pregunta y la mayoría de ellas fallaron en uno de los requisitos anteriores.
drop_first=True
conget_dummies
elimina la necesidad de soltar la columna original por separado