【问题标题】:How to use get_dummies or one hot encoding to encode a categorical feature with multiple elements?如何使用 get_dummies 或一种热编码来编码具有多个元素的分类特征?
【发布时间】:2021-07-11 02:24:33
【问题描述】:

我正在研究一个数据集,该数据集具有称为类别的功能。该特征中每个观察的数据由分号分隔的列表组成,例如。

Rows categories
Row 1 "categorya;categoryb;categoryc"
Row 2 "categorya;categoryb"
Row 3 "categoryc"
Row 4 "categoryb;categoryc"

如果我尝试pd.get_dummies(df,columns=['categories'])

我以列的形式返回包含全部数据的列,例如名为 categorya;categoryb;categoryc 的列

如果我尝试

pd.get_dummies(df.categories.str.split(";").apply(pd.Series).stack(),columns=['categories'])

我得到单独的列名,例如类别a,类别b。

但我只会在一列中得到 1,例如如果原始类别值为“categoryb;categoryc”,我只会在 b 中得到 1 而不是 c 值。

我感觉除了编码问题之外,我的方法可能会犯一个根本性错误?

【问题讨论】:

    标签: python pandas encoding one-hot-encoding


    【解决方案1】:

    在我看来,您正在更改数据结构的形状,使其与 DF 不匹配。

    df.categories.str.split(";").apply(pd.Series).stack()
    
    0  0    categorya
       1    categoryb
       2    categoryc
    1  0    categorya
       1    categoryb
    2  0    categoryc
    3  0    categoryb
       1    categoryc
    

    pd.get_dummies(df.categories.str.split(";").apply(pd.Series).stack())
    
         categorya  categoryb  categoryc
    0 0          1          0          0
      1          0          1          0
      2          0          0          1
    1 0          1          0          0
      1          0          1          0
    2 0          0          0          1
    3 0          0          1          0
      1          0          0          1
    

    如果您事先知道类别,您可以执行以下操作:

    df['categorya'] = np.where(df['categories'].str.contains('categorya'),1,0)
    
                          categories  categorya
    0  categorya;categoryb;categoryc          1
    1            categorya;categoryb          1
    2                      categoryc          0
    3            categoryb;categoryc          0
    

    或者,如果您事先不知道类别,您可以这样做:

    for s in df.categories.str.split(";").apply(pd.Series).stack().unique():
        df[s] = np.where(df['categories'].str.contains(s),1,0)
    
       categorya  categoryb  categoryc
    0          1          1          1
    1          1          1          0
    2          0          0          1
    3          0          1          1
    

    此外,您可以按主要索引汇总并在分类(虚拟)列上求和,以获得您要查找的内容。

    像这样:

    pd.get_dummies(df.categories.str.split(";").apply(pd.Series).stack()) \
        .groupby(level=0).sum()
    
       categorya  categoryb  categoryc
    0          1          1          1
    1          1          1          0
    2          0          0          1
    3          0          1          1
    

    那么最简单的:

    df['categories'].str.get_dummies(sep=';')
    
           categories  catA  catB  catC
    0  catA;catB;catC     1     1     1
    1       catA;catB     1     1     0
    2            catC     0     0     1
    3       catB;catC     0     1     1
    

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2017-08-21
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2021-03-07
      • 2019-05-30
      • 2023-03-06
      相关资源
      最近更新 更多