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

时间:2017-10-21 15:23:49

标签: python pandas dataframe

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

例如,

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

由此我想得到一个由以下内容组成的数据框:

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

我该怎么做?

2 个答案:

答案 0 :(得分:9)

请注意,您不是在与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

答案 1 :(得分:1)

想象有一个更简单的答案,或者我认为这比我们必须做的多个操作更简单。 确保列具有以逗号分隔的唯一值 在内置参数中使用get dummies将分隔符指定为逗号。此默认值为管道分隔。 data = {“mesh”:[“A,B,C”,“C,B”,“”]} sof_df = pd.DataFrame(数据) sof_df.mesh = sof_df.mesh.str.replace('','') sof_df.mesh.str.get_dummies(SEP = '') OUTPUT:     A B C. 0 1 1 1 1 0 1 1 2 0 0 0