将逗号分隔字符串的数据帧转换为单热编码

scu*_*nex 5 python dataframe pandas

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

例如,

data = {"mesh": ["A, B, C", "C,B", ""]}
Run Code Online (Sandbox Code Playgroud)

从这里我想得到一个包含以下内容的数据框:

index      A       B.     C
0          1       1      1
1          0       1      1
2          0       0      0
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

cs9*_*s95 12

请注意,您不是在与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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


小智 6

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

  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=',')
    
    Run Code Online (Sandbox Code Playgroud)

输出:

    A   B   C
0   1   1   1
1   0   1   1
2   0   0   0
Run Code Online (Sandbox Code Playgroud)