Как разбить текстовый столбец на список слов по разделителю?
Имеется датасет, в котором одна колонка с набором данных типа object (кондитерка). Например:
- 1 объект "шоколад, пряники, конфеты, зефир"
- n-ый объект "шоколад, пряники, конфеты, печенье, вафли"
То есть объекты имеют разную длину. Но каждое слово отделяется от предыдущего запятой.
Хочется разделить каждый объект на части и сделать кодирование One Hot. Если со вторым мне более менее ясно, то вот как разделить строку на несколько объектов - тут творческий ступор.
Ответы (2 шт):
Пример:
In [452]: from sklearn.preprocessing import MultiLabelBinarizer
In [453]: df = pd.DataFrame({"items": ["шоколад, пряники, конфеты, зефир", "шоколад, пряники, конфеты, печенье, вафли"]})
In [454]: df
Out[454]:
items
0 шоколад, пряники, конфеты, зефир
1 шоколад, пряники, конфеты, печенье, вафли
In [455]: mlb = MultiLabelBinarizer(sparse_output=False)
In [456]: X = pd.DataFrame(mlb.fit_transform(df["items"].str.split(",\s*")),
columns=mlb.classes_,
index=df.index)
In [457]: X
Out[457]:
вафли зефир конфеты печенье пряники шоколад
0 0 1 1 0 1 1
1 1 0 1 1 1 1
UPD: используем данные из Excel файла:
df = pd.read_excel("Food.xlsx", sheet_name="2020")
t = df["Кондитерка, выпечка, сухофрукты"].str.lower().fillna(",").str.split(",\s*")
X = pd.DataFrame(mlb.fit_transform(t), columns=mlb.classes_, index=df.index).drop(columns="")
результат:
In [35]: X
Out[35]:
арбуз батончики безе блин блины будочки булочки бургеры варенье вафли газировка зебра ... торт тортик тортики трафлы финик финики фрукты халва чернослив чизкейк чокопай шоколад
0 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
.. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
361 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 1 0 0 0 1
362 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
363 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
364 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
365 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0
[366 rows x 63 columns]
Как вариант, обычный CountVectorizer, который часто используют для текстов, тут тоже подойдёт. Но надо помнить, что у него по умолчанию есть некоторые параметры, которые, например, отбросят слова длиной меньше 2-х символов. Часть кода я покрал у MaxU уважаемого, раз уж есть готовая заготовка:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
df = pd.DataFrame({"items": ["шоколад, пряники, конфеты, зефир", "шоколад, пряники, конфеты, печенье, вафли"]})
cvec = CountVectorizer()
X = cvec.fit_transform(df['items'])
df_new = pd.DataFrame(X.todense(), columns=cvec.get_feature_names())