Pandasデータフレームからの多値カテゴリ変数をバイナリエンコードする方法


9

特定の列に複数の値を持つ次のデータフレームがあるとします。

    categories
0 - ["A", "B"]
1 - ["B", "C", "D"]
2 - ["B", "D"]

このようなテーブルを取得するにはどうすればよいですか?

   "A"  "B"  "C"  "D"
0 - 1    1    0    0
1 - 0    1    1    1
2 - 0    1    0    1

注:必ずしも新しいデータフレームは必要ありません。そのようなデータフレームを機械学習により適した形式に変換する方法を考えています。

回答:


7

[0, 1, 2]が数値ラベルであり、インデックスではない場合、pandas.DataFrame.pivot_table機能します。

[]:
data = pd.DataFrame.from_records(
    [[0、 'A']、[0、 'B']、[1、 'B']、[1、 'C']、[1、 'D']、[2、 'B']、[ 2、 'D']]、
    columns = ['number_label'、 'category'])
data.pivot_table(index = ['number_label']、columns = ['category']、aggfunc = [len]、fill_value = 0)
アウト[]:
              レン
カテゴリABCD
number_label                       
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

このブログ投稿は役に立ちました:http : //pbpython.com/pandas-pivot-table-explained.html


[0, 1, 2]がインデックスである場合、それcollections.Counterは役に立ちます:

[]:
data2 = pd.DataFrame.from_dict(
    {'カテゴリ':{0:['A'、 'B']、1:['B'、 'C​​'、 'D']、2:['B'、 'D']}})
data3 = data2 ['categories']。apply(collections.Counter)
pd.DataFrame.from_records(data3).fillna(value = 0)
アウト[]:
       あいうえお
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

よろしくお願いします。実際には、0、1、2がインデックスです。また、ゼロがたくさんあるので、ここでスパース性を効率的に処理する方法を知っていますか?
Denis L

パンダとscipyの両方に、メモリを節約するためのスパースデータ構造(pandas sparsescipy sparse)がありますが、使用する機械学習ライブラリではサポートされていない場合があります。問題の次元(列の数)が非常に大きく、スパース表現が必要な場合は、次元削減手法の使用も検討する必要があります。
Samuel Harrold、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.