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

Creating a data matrix – StackOverflow

1列の場合,「pandas.Series.factorize」がリーズナブルチョイス.

import io
import pandas as pd
import numpy as np


def series_binarizer(s):
  x, y = s.factorize()
  return pd.DataFrame(np.eye(len(y), dtype=np.uint8)[x], columns=y)


def series_binarizer2(s):
  a = s.values
  u = np.unique(a)
  return pd.DataFrame((a[:, None] == u).astype(np.uint8), columns=u)


def series_binarizer3(s):
  a = s.values
  u = np.unique(a)
  idx = np.searchsorted(u, a)
  return pd.DataFrame(np.eye(len(u), dtype=np.uint8)[idx], columns=u)


strings = """a 1
a 1
a 1
b 2
b 2
c 3
d 4
d 4
d 4"""
df = pd.read_csv(io.StringIO(strings), sep='\s+', header=None)
pd.concat((df, series_binarizer(df[1])), 1)
    0   1   1   2   3   4
0   a   1   1   0   0   0
1   a   1   1   0   0   0
2   a   1   1   0   0   0
3   b   2   0   1   0   0
4   b   2   0   1   0   0
5   c   3   0   0   1   0
6   d   4   0   0   0   1
7   d   4   0   0   0   1
8   d   4   0   0   0   1

或いは,「sklearn.preprocessing.MultiLabelBinarizer」を用いる.

from sklearn.preprocessing import MultiLabelBinarizer


pd.concat((df, pd.DataFrame(MultiLabelBinarizer().fit_transform(df[1].values.reshape(-1, 1)), columns=mlb.classes_)), 1)
    0   1   1   2   3   4
0   a   1   1   0   0   0
1   a   1   1   0   0   0
2   a   1   1   0   0   0
3   b   2   0   1   0   0
4   b   2   0   1   0   0
5   c   3   0   0   1   0
6   d   4   0   0   0   1
7   d   4   0   0   0   1
8   d   4   0   0   0   1
%timeit series_binarizer(df[1])
%timeit series_binarizer2(df[1])
%timeit series_binarizer3(df[1])
%timeit pd.DataFrame(MultiLabelBinarizer().fit_transform(df[1].values.reshape(-1, 1)), columns=mlb.classes_)
df = pd.concat([df]*1000000, ignore_index=True)
%timeit series_binarizer(df[1])
%timeit series_binarizer2(df[1])
%timeit series_binarizer3(df[1])
%timeit pd.DataFrame(MultiLabelBinarizer().fit_transform(df[1].values.reshape(-1, 1)), columns=mlb.classes_)
1000 loops, best of 3: 281 µs per loop
10000 loops, best of 3: 161 µs per loop
10000 loops, best of 3: 172 µs per loop
1000 loops, best of 3: 547 µs per loop
1 loop, best of 3: 265 ms per loop
1 loop, best of 3: 311 ms per loop
1 loop, best of 3: 393 ms per loop
1 loop, best of 3: 18.4 s per loop

 
 
関連:
配列(アレイ)をビニング処理してバイナライズ

pandas.Seriesをバイナライズ(文字列をダミー変数に置換)

複数列に於けるk-hot encode

文字列を分割してワンホットエンコーディング

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

列データのバイナライズ/ホットエンコード への2件のフィードバック

  1. ピンバック: バイナライズ時のNaNの処理 | 粉末@それは風のように (日記)

  2. ピンバック: データフレーム内のリストデータをOne Hot Encoding | 粉末@それは風のように (日記)

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中

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