2017-10-21 30 views
1

1つの列で構成される大きなデータフレーム( 'データ')があります。列の各行は文字列で構成され、各文字列はカンマで区切られたカテゴリで構成されています。このデータを1つのホットエンコードしたいと思います。このことからカンマ区切り文字列のデータフレームをワンホットエンコードに変換します。

例えば、

data = {"mesh": ["A, B, C", "C,B", ""]} 

私は、以下からなるデータフレームを取得したいと思います:

index  A  B.  C 
0   1  1  1 
1   0  1  1 
2   0  0  0 

私はこれをどのように行うことができますか?

答えて

3

OHEを扱っていないことに注意してください。 + stack + get_dummies + sumstr.splitを使用

オプション1

df = pd.DataFrame(data) 
print(df) 
     mesh 
0 A, B, C 
1  C,B 
2   

df = df.mesh.str.split('\s*,\s*', expand=True)\ 
       .stack().str.get_dummies().sum(level=0) 
print(df) 
    A B C 
0 1 1 1 
1 0 1 1 
2 0 0 0 

オプション2
apply + value_counts。 Bharath Shettyから学んだちょっとしたトリック。

df = df.mesh.str.split('\s*,\s*', expand=True)\ 
       .apply(pd.Series.value_counts, 1).iloc[:, 1:].fillna(0) 
print(df) 
    A B C 
0 1.0 1.0 1.0 
1 0.0 1.0 1.0 
2 0.0 0.0 0.0 

reset_index続いastypeを用いてさらにつべこべ、:

df = df.astype(int).reset_index() 
print(df) 
    index A B C 
0  0 1 1 1 
1  1 0 1 1 
2  2 0 0 0 

オプション3
pd.crosstab

x = df.mesh.str.split('\s*,\s*', expand=True).stack() 
df = pd.crosstab(x.index.get_level_values(0), x.values).iloc[:, 1:] 

print(df) 
col_0 A B C 
row_0   
0  1 1 1 
1  0 1 1 
2  0 0 0 
+0

'\' 'ラインcontinuatiその文字とそのインデント - 私の目! –

+1

あなたは本当に素晴らしいオプションを投稿するととても速いです。これは 'piR-esque'です。 – Dark

+0

@JonClements Lol dude ...彼らは' \ 'なしでもっと悪く見えます:p –

関連する問題