【问题标题】:Pandas: Turn multiple variables into a single set of dummy variablesPandas:将多个变量转换为一组虚拟变量
【发布时间】:2018-03-22 07:10:09
【问题描述】:

我有一个包含类别(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 创建一组虚拟变量。这可以工作,但如果有更多变量/类别,就会变得非常乏味。有没有更简单的方法来实现这一点?

【问题讨论】:

标签: python pandas


【解决方案1】:

通过使用pd.crosstab

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

【讨论】:

    【解决方案2】:

    最简单的方法是

    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
    

    【讨论】:

    • 就是这样。谢谢。
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2020-08-02
    • 2015-08-02
    • 2019-06-23
    相关资源
    最近更新 更多