Pandas在多列上使用get_dummies函数

11

我有一个数据集,其中有多个列需要进行独热编码。但是,由于这些列与相应的项目相关,因此我不想为每个列进行编码。我想要的是一组使用所有列的虚拟变量。请查看我的代码以获得更好的解释。

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

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,我希望只有一组(AB等),当列ch1ch2ch3中的任何一个值出现时,该组的值为1

澄清一下,在我的原始数据集中,单个行不会包含相同的值(A、B、C ...)超过一次;它只会出现在其中一列中。

4个回答

10
使用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

1
我会接受这个答案。然而,我想评论一下(对于那些正在阅读此内容的人),如果您的数据集很大,这种方法可能效果不佳。在我的情况下,我的数据框的形状大约是(100000,120),结果崩溃了。感谢您的帮助 :) - user3276768

6
你可以使用 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

0

这样调用它

x = pd.get_dummies(dum, prefix="", prefix_sep="")

然后使用打印

print(x.to_string(index=False))

输出显示了重复的列。它看起来就像Raunaq(另一个答案)发布的输出一样。 - user3276768

0

您可以为不同的列创建虚拟值,然后将结果连接起来:

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

在这种情况下,我会有重复的列(你有两个C)。我知道我可以将它们连接起来并保持数据集的清洁,但我想知道是否有一种更直接和简单的方法来做到这一点。 - user3276768
完全是我的错。我完全没有注意到。既然Wen已经给出了一个很好的答案,我会在我的答案上补充一些内容。 - Raunaq Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接