短い答え
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]]
より長い回答
この質問にはすでにたくさんの答えがあることは知っていますが、2つのことに気づきました。まず、ほとんどの回答はnumpyやpandasなどのパッケージを使用しています。そして、これは良いことです。量産コードを作成している場合は、numpy / pandasパッケージで提供されているような堅牢で高速なアルゴリズムを使用しているはずです。しかし、教育のために、誰かが他の人のアルゴリズムの実装だけでなく、透明なアルゴリズムを持つ答えを提供するべきだと思います。第二に、以下の要件のいずれかを満たさないため、多くの回答がワンホットエンコーディングの堅牢な実装を提供していないことに気付きました。以下は、便利で正確、かつ堅牢なワンホットエンコーディング機能の要件の一部です(私がそれらを参照)。
ワンホットエンコーディング関数は、次の条件を満たす必要があります。
- さまざまなタイプ(整数、文字列、浮動小数点数など)のリストを入力として処理する
- 重複した入力リストを処理する
- 入力に対応する(同じ順序で)リストのリストを返す
- 各リストが可能な限り短いリストのリストを返す
私はこの質問に対する答えの多くをテストしましたが、それらのほとんどは上記の要件の1つで失敗しました。
drop_first=True
とget_dummies
、元の列を個別に削除する必要がなくなります