Как создать макеты из списка с несколькими значениями и предопределенными категориями?

Я хотел бы преобразовать это:

In [4]: df
Out[4]:
      label
0     (a, e)
1     (a, d)
2       (b,)
3     (d, e)

к этому :

   a  b  c  d  e
0  1  0  0  0  1
1  1  0  0  1  0
2  0  1  0  0  0
3  0  0  0  1  1

Как вы можете видеть, есть предопределенные столбцы: «a», «b», «c», «d», «e» и c пусты, но все еще существуют.

Я пробовал несколько таких вещей: сначала df.str.join('|').str.get_dummies() без всех столбцов, чтобы получить манекены с несколькими значениями на входе, но я хочу добавить к нему предопределенные столбцы. .

Спасибо за помощь !


person Bilal Alauddin    schedule 08.07.2019    source источник
comment
Ваши столбцы label представляют собой серию кортежей или строк?   -  person Quang Hoang    schedule 08.07.2019


Ответы (3)


Хорошая практика для sklearn

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()

print (pd.DataFrame(mlb.fit_transform(df['label']),columns=mlb.classes_, index=df.index))
person BENY    schedule 08.07.2019
comment
Я нашел ответ, большое спасибо, я буду иметь это в виду в следующий раз - person Bilal Alauddin; 09.07.2019

Создайте новый DataFrame, затем stack + get_dummies. any по исходному индексу для чайников.

pd.get_dummies(pd.DataFrame([*df.label], index=df.index).stack()).any(level=0).astype(int)

   a  b  d  e
0  1  0  0  1
1  1  0  1  0
2  0  1  0  0
3  0  0  1  1

Поскольку у вас есть предопределенные столбцы, мы можем переиндексировать и заполнить отсутствующие 0.

res = pd.get_dummies(pd.DataFrame([*df.label], index=df.index).stack()).any(level=0)
res = res.reindex(list('abcde'), axis=1).fillna(0).astype(int)

#   a  b  c  d  e
#0  1  0  0  0  1
#1  1  0  0  1  0
#2  0  1  0  0  0
#3  0  0  0  1  1
person ALollz    schedule 08.07.2019
comment
Спасибо !! Это сработало, когда я использовал df.str.join('|').str.get_dummies(), а затем df.reindex(columns = ['a','b','c','d','e'] , значение_заполнения=0) - person Bilal Alauddin; 09.07.2019

Попробуй это:

df['label'].str.join(sep='*').str.get_dummies(sep='*')
person Ankit Agrawal    schedule 08.07.2019
comment
Благодарю вас ! :) Единственная проблема в том, что он не создаст столбец «c», как показано в моем примере, я нашел решение в комментарии к первому ответу. - person Bilal Alauddin; 09.07.2019