Коротка відповідь
Ось функція робити однокольорове кодування без використання numpy, pandas або інших пакетів. Він містить список цілих чисел, булевих рядків або рядків (і, можливо, також інших типів).
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
Приклад:
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]]
Довгий (ер) відповідь
Я знаю, що відповідей на це питання вже багато, але я помітив дві речі. По-перше, більшість відповідей використовують такі пакети, як numpy та / або панди. І це гарна річ. Якщо ви пишете виробничий код, вам, ймовірно, слід користуватися надійними, швидкими алгоритмами, такими, які надаються в пакетах numpy / pandas. Але, заради освіти, я думаю, що хтось повинен надати відповідь, яка має прозорий алгоритм, а не просто реалізацію чужого алгоритму. По-друге, я зауважив, що багато відповідей не забезпечують надійної реалізації однокольорового кодування, оскільки вони не відповідають одній із наведених нижче вимог. Нижче наведено деякі вимоги (як я бачу) щодо корисної, точної та надійної функції гарячого кодування:
Функція кодування з гарячим режимом повинна:
- обробляти список різних типів (наприклад, цілі числа, рядки, поплавці тощо) як вхідні дані
- обробляти список введення дублікатами
- повернути список списків, що відповідають (у тому ж порядку, що і) вхідним запитам
- повернути список списків, де кожен список є якомога коротшим
Я перевірив багато відповідей на це запитання, і більшість з них не відповідають одній із вимог, що вказані вище.
drop_first=True
зget_dummies
усуває необхідність окремо скинути початковий стовпчик