ВЫХОД:

я есть большой фрейм данных («данные»), состоящий из одного столбца. Каждая строка в столбце состоит из строки, а каждая строка состоит из разделенных запятыми категорий. Я хочу один горячий кодировать эти данные.

Например,

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

Из этого я хотел бы получить фрейм данных, состоящий из:

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

Как я могу это сделать?

Ответы на вопрос(2)

Решение Вопроса

что вы не имеете дело с 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
 coldspeed21 окт. 2017 г., 17:45
@Bharathshetty Спасибо за вариант 2 :-)
 Jon Clements♦21 окт. 2017 г., 17:42
\ символ продолжения линии и этот отступ - мои глаза!
 Dark21 окт. 2017 г., 17:43
Вы так быстро публикуете варианты, действительно приятно. Теперь этоpiR-esque
 coldspeed20 февр. 2019 г., 07:46
@JonClements исправлено ...: P

что есть более простой ответ, или я чувствовал, что это более простой по сравнению с несколькими операциями, которые мы должны сделать.

Убедитесь, что столбец имеет уникальные значения, разделенные запятыми

Используйте 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

Ваш ответ на вопрос