[英]Pandas get_dummies on multiple columns
我有一個包含多個列的數據集,我希望對其進行一次熱編碼。 但是,我不想為它們中的每一個都設置編碼,因為所述列與所述項目相關。 我想要的是使用所有列的一組“虛擬變量”。 請參閱我的代碼以獲得更好的解釋。
假設我的數據框如下所示:
In [103]: dum = pd.DataFrame({'ch1': ['A', 'C', 'A'], 'ch2': ['B', 'G', 'F'], 'ch3': ['C', 'D', 'E']})
In [104]: dum
Out[104]:
ch1 ch2 ch3
0 A B C
1 C G D
2 A F E
如果我執行
pd.get_dummies(dum)
輸出將是
ch1_A ch1_C ch2_B ch2_F ch2_G ch3_C ch3_D ch3_E
0 1 0 1 0 0 1 0 0
1 0 1 0 0 1 0 1 0
2 1 0 0 1 0 0 0 1
但是,我想獲得的是這樣的:
A B C D E F G
1 1 1 0 0 0 0
0 0 1 1 0 0 1
1 0 0 0 1 1 0
而不是有多個列表示編碼,例如ch1_A
和ch1_C
,我只希望當ch1
、 ch2
、 ch3
列中的任何值出現時,只有一個組( A
、 B
等)的值為1
。
澄清一下,在我的原始數據集中,單行不會多次包含相同的值 (A,B,C...); 它只會出現在其中一列上。
使用stack
和str.get_dummies
dum.stack().str.get_dummies().sum(level=0)
Out[938]:
A B C D E F G
0 1 1 1 0 0 0 0
1 0 0 1 1 0 0 1
2 1 0 0 0 1 1 0
您可以使用pd.crosstab
創建頻率表:
import pandas as pd
dum = pd.DataFrame({'ch1': ['A', 'C', 'A'], 'ch2': ['B', 'G', 'F'], 'ch3': ['C', 'D', 'E']})
stacked = dum.stack()
index = stacked.index.get_level_values(0)
result = pd.crosstab(index=index, columns=stacked)
result.index.name = None
result.columns.name = None
print(result)
產量
A B C D E F G
0 1 1 1 0 0 0 0
1 0 0 1 1 0 0 1
2 1 0 0 0 1 1 0
這樣稱呼
x = pd.get_dummies(dum, prefix="", prefix_sep="")
然后打印使用
print(x.to_string(index=False))
您可以為單獨的列創建虛擬對象並連接結果:
temp = pd.concat([pd.get_dummies(dum[col]) for col in dum], axis=1)
A C B F G C D E
0 1 0 1 0 0 1 0 0
1 0 1 0 0 1 0 1 0
2 1 0 0 1 0 0 0 1
temp.groupby(level=0, axis=1).sum()
A B C D E F G
0 1 1 1 0 0 0 0
1 0 0 1 1 0 0 1
2 1 0 0 0 1 1 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.