【问题标题】:Convert pandas DataFrame column of comma separated strings to one-hot encoded将逗号分隔字符串的 pandas DataFrame 列转换为 one-hot 编码
【发布时间】:2018-04-02 13:16:09
【问题描述】:

我有一个由一列组成的大型数据框(“数据”)。列中的每一行由一个字符串组成,每个字符串由逗号分隔的类别组成。我希望对这些数据进行一次热编码。

例如,

data = {"mesh": ["A, B, C", "C,B", ""]}

从这里我想得到一个数据框,包括:

index      A       B.     C
0          1       1      1
1          0       1      1
2          0       0      0

我该怎么做?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    请注意,您不是在处理 OHE。

    str.split + stack + get_dummies + sum

    df = pd.DataFrame(data)
    df
    
          mesh
    0  A, B, C
    1      C,B
    2         
    
    (df.mesh.str.split('\s*,\s*', expand=True)
       .stack()
       .str.get_dummies()
       .sum(level=0))
    df
    
       A  B  C
    0  1  1  1
    1  0  1  1
    2  0  0  0
    

    apply + value_counts

    (df.mesh.str.split(r'\s*,\s*', expand=True)
       .apply(pd.Series.value_counts, 1)
       .iloc[:, 1:]
       .fillna(0, downcast='infer'))
    
       A  B  C
    0  1  1  1
    1  0  1  1
    2  0  0  0
    

    pd.crosstab

    x = df.mesh.str.split('\s*,\s*', expand=True).stack()
    pd.crosstab(x.index.get_level_values(0), x.values).iloc[:, 1:]
    df
    
    col_0  A  B  C
    row_0         
    0      1  1  1
    1      0  1  1
    2      0  0  0
    

    【讨论】:

    • \ 行继续字符和缩进 - 我的眼睛!
    • 您发布选项的速度非常快,非常好。现在这是piR-esque
    • @JonClements 已修复...:P
    【解决方案2】:

    想出了一个更简单的答案,或者与我们必须进行的多个操作相比,我觉得这更简单。

    1. 确保该列具有以逗号分隔的唯一值

    2. 在内置参数中使用 get dummies 将分隔符指定为逗号。默认为管道分隔。

      data = {"mesh": ["A, B, C", "C,B", ""]}
      sof_df=pd.DataFrame(data)
      sof_df.mesh=sof_df.mesh.str.replace(' ','')
      sof_df.mesh.str.get_dummies(sep=',')
      

    输出:

        A   B   C
    0   1   1   1
    1   0   1   1
    2   0   0   0
    

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 2022-06-25
      • 2019-11-18
      相关资源
      最近更新 更多