2017-10-10 170 views
1

我有一個包含類別(A,B,C,D)的列,我想變成虛擬變量。問題是,該列可以包含每行多個類別,例如:熊貓:將多個變量轉換爲一組虛擬變量

DF = pd.DataFrame({'Col':['A', 'A, B', 'A, C', 'B, C, D', 'D']}) 

    Col 
0 A 
1 A, B 
2 A, C 
3 B, C, D 
4 D 

我在這一點想到的是第一分割使用可變分爲多個字段「」作爲分隔符,則僞代碼的結果。事情是這樣的:

DF2 = DF['Col'].str.split(', ', expand = True) 

    0 1  2 
0 A None None 
1 A B  None 
2 A C  None 
3 B C  D 
4 D None None 

pd.get_dummies(DF2) 

    0_A 0_B 0_D 1_B 1_C 2_D 
0 1 0 0 0 0 0 
1 1 0 0 1 0 0 
2 1 0 0 0 1 0 
3 0 1 0 0 1 1 
4 0 0 1 0 0 0 

最後,通過運行某種循環的跨列創建一組爲A,B,C和D這可以工作虛擬變量,但得到相當繁瑣了許多更多的變量/類別。有沒有更簡單的方法來實現這一目標?

+0

檢查鏈接.. https://stackoverflow.com/questions/46290726 /如何對化妝dummy-變量與逗號分隔值列 – Wen

回答

6

簡單的方法是

DF.Col.str.get_dummies(', ') 

    A B C D 
0 1 0 0 0 
1 1 1 0 0 
2 1 0 1 0 
3 0 1 1 1 
4 0 0 0 1 

稍微複雜

from sklearn.preprocessing import MultiLabelBinarizer 
from numpy.core.defchararray import split 

mlb = MultiLabelBinarizer() 
s = DF.Col.values.astype(str) 
d = mlb.fit_transform(split(s, ', ')) 

pd.DataFrame(d, columns=mlb.classes_) 

    A B C D 
0 1 0 0 0 
1 1 1 0 0 
2 1 0 1 0 
3 0 1 1 1 
4 0 0 0 1 
+0

就是這樣。謝謝。 – AdmiralWen

0

通過使用pd.crosstab

import pandas as pd 
df = pd.DataFrame({'Col':['A', 'A,B', 'A,C', 'B,C,D', 'D']}) 
df.Col=df.Col.str.split(',') 
df1=df.Col.apply(pd.Series).stack() 
pd.crosstab(df1.index.get_level_values(0),df1) 

Out[893]: 
col_0 A B C D 
row_0    
0  1 0 0 0 
1  1 1 0 0 
2  1 0 1 0 
3  0 1 1 1 
4  0 0 0 1