scikit-learn: одна горячая кодировка столбца со значениями списка
Я пытаюсь закодировать кадр данных, как показано ниже:
азбука
2 "Привет" ["мы", "мы", "хорошо"]
1 'All' ['hello', 'world']
Теперь, как вы можете видеть, я могу пометить строковые значения второго столбца, но я не могу понять, как выполнить кодирование третьего столбца, в котором есть список строковых значений, а длина списков различна. Даже если я это сделаю один код, я получу массив, который я не знаю, как объединить с элементами массива других столбцов после кодирования. Пожалуйста, предложите хорошую технику
1 ответ
Предполагая, что у нас есть следующий DF:
In [31]: df
Out[31]:
A B C
0 2 Hello [we, are, good]
1 1 All [hello, world]
Давайте использовать http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html
In [32]: from sklearn.feature_extraction.text import CountVectorizer
In [33]: vect = CountVectorizer()
In [34]: X = vect.fit_transform(df.C.str.join(' '))
In [35]: df = df.join(pd.DataFrame(X.toarray(), columns=vect.get_feature_names()))
In [36]: df
Out[36]:
A B C are good hello we world
0 2 Hello [we, are, good] 1 1 0 1 0
1 1 All [hello, world] 0 0 1 0 1
В качестве альтернативы вы можете использовать http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html, как @VivekKumar, предложенный в этом комментарии.
In [56]: from sklearn.preprocessing import MultiLabelBinarizer
In [57]: mlb = MultiLabelBinarizer()
In [58]: X = mlb.fit_transform(df.C)
In [59]: df = df.join(pd.DataFrame(X, columns=mlb.classes_))
In [60]: df
Out[60]:
A B C are good hello we world
0 2 Hello [we, are, good] 1 1 0 1 0
1 1 All [hello, world] 0 0 1 0 1