Создайте номер сеанса на основе значений столбцов в панд

#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. Спасибо! это работает 🙂