熊猫:将多个变量转换为一组虚拟变量

时间:2017-10-10 19:06:59

标签: python pandas

我有一个包含类别(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创建一组虚拟变量。这可以起作用,但是对于更多变量/类别来说却相当繁琐。有没有更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

{{1}}