簡體   English   中英

多列上的 Pandas get_dummies

[英]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_Ach1_C ,我只希望當ch1ch2ch3列中的任何值出現時,只有一個組( AB等)的值為1

澄清一下,在我的原始數據集中,單行不會多次包含相同的值 (A,B,C...); 它只會出現在其中一列上。

使用stackstr.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM