Разделить колонку в DataFrame по определенным словам
есть Excel файл с данными. В одной колонке объединено много значений и их нужно разделить на несколько колонок. Строки не всегда одинаковые, т.е. в любой строке может не быть какой-то части. Вот примеры строк:
Производитель " BP EUROPA SE" тов. знак "НЕИЗВЕСТНА", марка BRAYCOTE 601EF кол-во=2
Производитель " ITW PRO BRANDS " тов. знак "LPS" кол-во=105
Производитель "77 B.V." тов. знак "77" марка "77"
Производитель "ARMITE LABORATORIES INC" тов. знак "ARMITE" марка ARMITE LF-AS 328 артикул LF-AS 328 кол-во=5
Разделить нужно по словам "Производитель", "тов. знак", "марка", "артикул", "кол-во" по разным колонкам.
С обычной строкой мне удалось это сделать с помощью
new_value = re.split(r'Производитель|тов. знак|марка|модель|кол-во=',str)
А вот с DataFrame не получается. Помогите, пожалуйста
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
Комментарии в коде
txt = """Производитель " BP EUROPA SE" тов. знак "НЕИЗВЕСТНА", марка BRAYCOTE 601EF кол-во=2
Производитель " ITW PRO BRANDS " тов. знак "LPS" кол-во=105
Производитель "77 B.V." тов. знак "77" марка "77"
Производитель "ARMITE LABORATORIES INC" тов. знак "ARMITE" марка ARMITE LF-AS 328 артикул LF-AS 328 кол-во=5"""
df = pd.DataFrame({'Текст': txt.split('\n')})
stopwords = 'Производитель|тов\. знак|марка|модель|артикул|кол-во=|$' # перечень слов - ограничителей
pat = '|'.join(fr'{word}(?P<{"".join(x for x in word.title() if x.isalpha())}>.+?)(?={stopwords})' for word in stopwords.split('|')[:-1]) # формируем паттерн для извлечения фрагментов в виде именованных групп захвата
df = pd.concat([df, df['Текст'].str.extractall(pat).groupby(level=0).first().apply(lambda x: x.str.strip(' ",'))], axis=1) # извлекаем нужные фрагменты, чистим от побочных символов и склеиваем результат с исходным фреймом
print(df)
Текст Производитель ТовЗнак Марка Модель Артикул КолВо
0 Производитель " BP EUROPA SE" тов. знак "НЕИЗВЕСТНА", марка BRAYCOTE 601EF кол-во=2 BP EUROPA SE НЕИЗВЕСТНА BRAYCOTE 601EF None None 2
1 Производитель " ITW PRO BRANDS " тов. знак "LPS" кол-во=105 ITW PRO BRANDS LPS None None None 105
2 Производитель "77 B.V." тов. знак "77" марка "77" 77 B.V. 77 77 None None None
3 Производитель "ARMITE LABORATORIES INC" тов. знак "ARMITE" марка ARMITE LF-AS 328 артикул LF-AS 328 кол-во=5 ARMITE LABORATORIES INC ARMITE ARMITE LF-AS 328 None LF-AS 328 5
