2017-10-21 40 views
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。

選項1
使用str.split + stack + get_dummies + sum

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 

此外挑剔,使用astype,隨後reset_index

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哈哈老兄......他們看起來更糟,沒有'\':p –

相關問題