#python #pandas
Вопрос:
У меня есть приведенный ниже фрейм данных pandas с идентификатором пользователя и событием.
Я хочу определить различные сеансы поиска на основе произошедших событий.
Когда пользователь переходит от события A к событию B, это будет только 1 сеанс поиска. Если тот же пользователь, перейдя из A —> B, снова перейдет в A, это будет новый сеанс поиска. Когда меняется идентификатор пользователя, меняется и номер поиска.
То, что я объяснил для A — > B, также может произойти из B — > > A. Итак, когда пользователь начинает с события B и переходит к событию A, это будет один уникальный сеанс поиска.
Дополнительное примечание: A —> B или B —>> A может иметь столько раз A и B подряд.
Дополнительное примечание 2: иногда поиск-это просто последовательность As или последовательность Bs.
Ниже двух столбцов, которые у меня есть (идентификатор пользователя, событие), и столбца, до которого я бы дожил: поиск.
идентификатор пользователя | событие | Поиск |
---|---|---|
1 | A | поиск_1 |
1 | A | поиск_1 |
1 | B | поиск_1 |
1 | A | поиск_2 |
2 | A | поиск_3 |
2 | B | поиск_3 |
2 | B | поиск_3 |
3 | B | поиск_4 |
3 | A | поиск_4 |
4 | B | поиск_5 |
4 | B | поиск_5 |
У тебя есть какие-нибудь идеи? в таблице примеров приведены некоторые примеры, упомянутые ранее
Заранее спасибо
Комментарии:
1. пожалуйста, проверьте идентификатор пользователя->событие->>поиск 1->>>B->>>>поиск_1 1->>>>> > A->>>>>> > поиск_2… и затем.. 3->B->>поиск _4 3->>>A->>>>поиск _4 два исходных текста верны или нет, так как это немного сбивает с толку..
2. это правильно, как я уже упоминал в вопросе: «Если тот же пользователь, перейдя из A —> B, снова перейдет в A, это будет новый сеанс поиска». Это тот же пользователь, но новый сеанс, потому что он уже завершил цикл A-B
3. @Sarin Рассмотрим пример, в котором
user_id=1
мы имеем следующую последовательность['A', 'A', 'B', 'A', 'B', 'B', 'B', 'A', 'A', 'B']
событий. Каким должен быть ожидаемый результат в таком случае?4. @ShubhamSharma в этом случае это будет search_: 1,1,1, 2,2,2,2, 3,3,3
Ответ №1:
Я думаю, что приведенная ниже логика кода не требует пояснений, если вам все еще нужно объяснение, дайте мне знать
user = []
event = set()
count = 0
ls_event_id = ""
ls_user_id = 0
def search_id(user_id,event_id):
global count, ls_event_id, ls_user_id
if ls_event_id != event_id or ls_user_id != user_id:
if user_id not in user:
user.append(user_id)
event.clear()
event.add(event_id)
count = 1
elif user_id in user and event_id not in event:
event.add(event_id)
elif event_id not in event:
event.add(event_id)
count = 1
if len(event)==2:
event.clear()
user.clear()
ls_event_id = event_id
ls_user_id = user_id
return f'search_{count}'
df['search'] = df.apply(lambda x:search_id(x.user_id,x.event),axis=1)
Комментарии:
1. Спасибо! это работает 🙂