2017-07-28 3 views
3

データフレーム内のカテゴリのリストをそれらを分解してエンコードしようとしています。次に、この一連のリストから行列を作成します(それらを長さに正規化し、多次元配列を作成し、行列の要素を1つホットエンコードします)。パンダのデータフレームのリストをエンコード/ファクタリング

ただし、要因によって行間の一貫性が維持されません。 これはここで見ることができます:

>>> import pandas as pd 
>>> df = pd.DataFrame({'A': [ ['Other', 'Male', 'Female', 'Male', 'Other'], ['Female', 'Other', 'Male'] ]}) 
>>> df['B'] = df.A.apply(lambda x: pd.factorize(x)[0]) 
>>> df 
            A    B 
0 [Other, Male, Female, Male, Other] [0, 1, 2, 1, 0] 
1    [Female, Other, Male]  [0, 1, 2] 

誰もが行の間で同じであるこのシリーズのエンコーディングを維持する方法を知っていますか?

+0

get_dummiesは、ご利用の場合は動作しませんか? –

+0

'get_dummies'アイデアをありがとう、私は本当にワンホットベクトルを作成する方法が好きです。残念ながら、私は、各要素のリストの長さが等しくない場合には、シリーズから1つのホットベクトルをすべて3Dテンソル型の形状に戻す方法をまだ考えていませんでした。 – chase

答えて

4

あなたはsklearnからLabelEncoderを使用することができます。

は、エンコーダを合わせる:

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
le.fit([s for l in df.A for s in l]) 

は、列を変換:

df.A.apply(le.transform) 
#0 [2, 1, 0, 1, 2] 
#1   [0, 2, 1] 
#Name: A, dtype: object 

le.classes_ 
#array(['Female', 'Male', 'Other'], 
#  dtype='<U6') 
+1

ありがとう、本当に好きですこれは簡単に 'df ['C'] = df.B.apply(lambda x:le.classes_ [x])'でラベルに戻ることができます。 – chase

3

カラムAのすべての値を使用して、自分で簡単に行うことができます。

まず、集合理解を使用して、列Aのすべてのユニークなアイテムのコレクションを作成します。次に、キーがこれらの一意の項目であり、値がこれらのソートされた一意の項目に基づいて列挙される辞書の理解を使用します。

次に、リストの理解度を使用してこの辞書の項目を検索します。

s = set(item for sublist in df.A for item in sublist) 
s = {k: n for n, k in enumerate(sorted(list(s)))} 

>>> df.assign(B=[[s[key] for key in sublist] for sublist in df['A']]) 
            A    B 
0 [Other, Male, Female, Male, Other] [2, 1, 0, 1, 2] 
1    [Female, Other, Male]  [0, 2, 1] 
+0

ありがとう、これは良い答えです。エンコーディングを大いに制御しているからです。私は独自のエンコーダークラスを作成してワンホットエンコーディング、ハフマンエンコーディング、インデックスエンコーディングを行っていましたが、一貫性を維持するためのアイデアを見たいだけで、エンコーディングを定義するだけの複雑なコードはありませんでした – chase

関連する問題