データフレーム内のリストデータをOne Hot Encoding

Convert pandas column of lists into matrix representation (One Hot Encoding) – StackOverflow

構造化されていないPandasの皮を被ったただのリストなので,リストはリストと割り切って処理するのがリーズナブル.解答の方法は時間効率が悪すぎて,とてもじゃないけど実用的ではない.

複数列のバイナライズは関連の様に,MultiLabelBinarizerがリーズナブルチョイス.

import pandas as pd
from itertools import chain
from sklearn.preprocessing import MultiLabelBinarizer


s = pd.Series([[1,2,3],[3,4,5],[1,6]])

lst = list(chain.from_iterable(s.values.tolist()))
r = range(min(lst), max(lst)+1)
df = pd.DataFrame([[1 if i in l else 0 for i in r] for l in s], columns=r)
df
    1   2   3   4   5   6
0   1   1   1   0   0   0
1   0   0   1   1   1   0
2   1   0   0   0   0   1
%timeit s.map(lambda x: ','.join(map(str, x))).str.get_dummies(sep=',')
%timeit lst = list(chain.from_iterable(s.values.tolist()));r = range(min(lst), max(lst)+1);pd.DataFrame([[1 if i in l else 0 for i in r] for l in s], columns=r)
%timeit mlb = MultiLabelBinarizer();pd.DataFrame(mlb.fit_transform(s.values.tolist()),columns=mlb.classes_)

s = pd.concat([s]*10000, ignore_index=True)
%timeit s.map(lambda x: ','.join(map(str, x))).str.get_dummies(sep=',')
%timeit lst = list(chain.from_iterable(s.values.tolist()));r = range(min(lst), max(lst)+1);pd.DataFrame([[1 if i in l else 0 for i in r] for l in s], columns=r)
%timeit mlb = MultiLabelBinarizer();pd.DataFrame(mlb.fit_transform(s.values.tolist()),columns=mlb.classes_)
100 loops, best of 3: 2.1 ms per loop
1000 loops, best of 3: 603 µs per loop
1000 loops, best of 3: 303 µs per loop

1 loop, best of 3: 676 ms per loop
10 loops, best of 3: 75.4 ms per loop
10 loops, best of 3: 37.2 ms per loop

 
 
関連:
複数列に於けるk-hot encode

列データのバイナライズ/ホットエンコード

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください