Pandas get_dummies在多个列上

use*_*768 6 python pandas

我有一个包含多列的数据集,我想进行一次热编码.但是,我不希望对它们中的每一个进行编码,因为所述列与所述项目相关.我想要的是一组使用所有列的虚拟变量.请参阅我的代码以获得更好的解释.

假设我的数据框看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

如果我执行

pd.get_dummies(dum)
Run Code Online (Sandbox Code Playgroud)

输出将是

   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
Run Code Online (Sandbox Code Playgroud)

但是,我想要获得的是这样的:

 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
Run Code Online (Sandbox Code Playgroud)

代替具有表示编码,例如多列的ch1_Ach1_C,我只希望有一组(A,B,等等)与值1时任何在列中的值的ch1,ch2,ch3显示出来.

为了澄清,在我的原始数据集中,单行不会包含相同的值(A,B,C ...)不止一次; 它只会出现在其中一列上.

WeN*_*Ben 7

使用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
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 5

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

产量

   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
Run Code Online (Sandbox Code Playgroud)