2017-02-13 13 views
1

私は以下のようなデータフレームを持っています。 ID列と各顧客の製品履歴があります。行の文字列値をフィーチャに変換する方法

ID  1 2 3 4 
1  A B C D 
2  E C B D 
3  F B C D 

各顧客の製品をリストするのではなく、製品を機能(列)に変換してデータフレームをこのように見せたいと思います。

ID  A B C D E F 
1  1 1 1 1 0 0 
2  0 0 0 1 1 0 
3  0 1 1 1 0 1 

Iしかし、これは1-F、2-B、何ではない2-C、...など、1-A、1-Eなどの異なる列をレンダリングする、get_dummies関数を使用しようとしました私は欲しい。

これが行われ得ることに何かアドバイス。

+1

。 [Pythonでホットエンコードする方法は?](http://stackoverflow.com/questions/37292872/how-can-i-one-hot-encode-in-python)を参照してください。 –

答えて

2

これにより、必要なデータフレームが得られます。

df = pd.get_dummies(df.set_index('ID').T.unstack()).groupby(level=0).sum().astype(int) 

print (df) 

出力:

A B C D E F 
ID     
1 1 1 1 1 0 0 
2 0 1 1 1 1 0 
3 0 1 1 1 0 1 
2

あなたはmaxget_dummiesや集計を使用することができます:あなたはカスタム関数を使用することができます

print (pd.get_dummies(df.set_index('ID').stack()) 
     .groupby(level=0).max().astype(int)) 

が、それは次のとおりです。

print (pd.get_dummies(df.set_index('ID'), prefix_sep='', prefix='') 
     .groupby(axis=1, level=0).max()) 

かを遅い:

df = df.set_index('ID').apply(lambda x: pd.Series(dict(zip(x, [1]*len(df.columns)))), axis=1) 
     .fillna(0) 
     .astype(int) 
print (df) 
    A B C D E F 
ID     
1 1 1 1 1 0 0 
2 0 1 1 1 1 0 
3 0 1 1 1 0 1 

私はタイミングについての興味深いだった:あなたは1つのホットエンコーディングが必要な場合があります

np.random.seed(123) 
N = 10000 
L = list('ABCDEFGHIJKLMNOPQRST') 
#[10000 rows x 20 columns] 
df = pd.DataFrame(np.random.choice(L, size=(N,5))) 
df = df.rename_axis('ID').reset_index() 
print (df.head()) 

#Alex Fung solution 
In [160]: %timeit (pd.get_dummies(df.set_index('ID').T.unstack()).groupby(level=0).sum().astype(int)) 
10 loops, best of 3: 27.9 ms per loop 

In [161]: %timeit (pd.get_dummies(df.set_index('ID').stack()).groupby(level=0).max().astype(int)) 
10 loops, best of 3: 26.3 ms per loop 

In [162]: %timeit (pd.get_dummies(df.set_index('ID'), prefix_sep='', prefix='').groupby(axis=1, level=0).max()) 
10 loops, best of 3: 26.4 ms per loop 

In [163]: %timeit (df.set_index('ID').apply(lambda x: pd.Series(dict(zip(x, [1]*len(df.columns)))), axis=1).fillna(0).astype(int)) 
1 loop, best of 3: 3.95 s per loop 
+0

a()ブラケットがないと、コードが機能しません。 –

+0

Python 2.7で 'IndentationError:unexpected indent'が発生しました。 –

+0

はい、次いで 'DF = df.set_index( 'ID')のような1行しか必要とする適用(ラムダX:pd.Series(辞書(ZIP(X [1] * lenは(df.columnsを))))最初の行と最後の行の最後に '\\'を追加してください。 – jezrael

関連する問題