Оптимизация списка товаров с помощью Python
Прошу помочь с решением следующего вопроса. Из Appmetrica я получаю результаты поисковой выдачи посетителям мобильного приложения: перечень товаров, которые ищут посетители. Однако одновременно с наименованием товаров, я также получаю все, что ввел пользователь в поисковую строку. Так настроено мобильное приложение разработчиком.
Мне необходимо удалить этот "информационный мусор". Так, например, посетитель может искать "бинт". Приложение ему выдает в подсказки в поисковой строке по буквам. И, в итоге, после выгрузки из api Appmetrica отчета по нужному мне событию я получаю:
б
би
бин
бинт
И так далее с другими товарами. Есть наименования товаров с несколькими словами, я пробовал выдергивать только первое слово
data['product_first_word'] = data['product'].apply(lambda x: x.split()[:1]).apply(lambda x: ' '.join(x))
Но, проблема в том, что посетитель может написать тот же "бинт", как "бнт" или "бант", ошибаясь или не попадая в буквы на эл. клавиатуре.
Вопрос в следующем, как мне в перечне товаров, где, помимо прочего, встречаются:
б
би
бинт
Оставить только слово "бинт" (то есть само целое слово в перечене)?
Список выгружается таким образом, что всегда перед последним словом будут его "побуквенные" разновидности
К сожалению, в регулярных выражениях я не силен. Поэтому даже нет малейших соображений (пример кода) на этот счет.
| товар | количество событий |
|---|---|
| б | 23 |
| би | 43 |
| бин | 65 |
| бинт | 76 |
| бинт м | 96 |
| бинт мар | 116 |
| бинт марл | 136 |
| бинт марле | 143 |
| бинт марлев | 152 |
| бинт марлевы | 159 |
| бинт марлевый | 179 |
Ответы (1 шт):
import pandas as pd
df = pd.DataFrame(data={
'product': [
'б', 'би', 'бин', 'бинт',
'б', 'ба', 'бар', 'бара', 'баран', 'баранк', 'баранка'
]
})
print(df[df['product'] != df['product'].shift(-1).str[:-1]])
$ python demo.py 3 бинт 10 баранка
Объяснение
Запускаем интерпертатор, создаём фрейм:
$ python
Python 3.10.0 (default, Oct 16 2021, 12:17:56) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
@>>> import pandas as pd
@>>> df = pd.DataFrame(data={'product': ['б', 'би', 'бин', 'бинт', 'б', 'ба', 'бар', 'бара', 'баран', 'баранк', 'баранка']})
@>>> df
product
0 б
1 би
2 бин
3 бинт
4 б
5 ба
6 бар
7 бара
8 баран
9 баранк
10 баранка
next_product - колонка с продуктами, смещённая на одну запись вверх:
@>>> df['next_product'] = df['product'].shift(-1)
@>>> df
product next_product
0 б би
1 би бин
2 бин бинт
3 бинт б
4 б ба
5 ба бар
6 бар бара
7 бара баран
8 баран баранк
9 баранк баранка
10 баранка NaN
complete_request сравнивает продукт и следующий продукт без последней буквы. Если они не равны, это последний запрос в цепочке:
@>>> df['complete_request'] = df['product'] != df['next_product'].str[:-1]
@>>> df
product next_product complete_request
0 б би False
1 би бин False
2 бин бинт False
3 бинт б True
4 б ба False
5 ба бар False
6 бар бара False
7 бара баран False
8 баран баранк False
9 баранк баранка False
10 баранка NaN True
По complete_request можно отфильтровать фрейм. Останутся только строки с полными запросами:
@>>> print(df[df['complete_request']])
product next_product complete_request
3 бинт б True
10 баранка NaN True
@>>>