Создание счетчика на уровне группы в pandas Dataframe, оптимизация - PullRequest
0 голосов
/ 26 мая 2018

У меня есть такой набор данных:

user_id  communication_type  
7         Newsletter
7         Newsletter
7         Newsletter
7         Newsletter
7         Conference
7    Upcoming Events
7    Upcoming Events
7    Upcoming Events
7         Conference
7         Conference
7            Webinar
7          Hackathon

Требуемый вывод:

user_id  communication_type    sent_past
7         Newsletter            0
7         Newsletter            1
7         Newsletter            2
7         Newsletter            3
7         Conference            0
7    Upcoming Events            0 
7    Upcoming Events            1
7    Upcoming Events            2  
7         Conference            1
7         Conference            2 
7            Webinar            0
7          Hackathon            0

В основном получают счетчик на каждом уровне тип_ связи для определенного user_id.

Решения, которые работают для меня:

train['sent_past'] = train.groupby(['user_id','communication_type']).apply(lambda x: x.reset_index()).index.get_level_values(1)

Но это очень медленно на ~ 1м рядах.Как я могу оптимизировать это?

1 Ответ

0 голосов
/ 26 мая 2018

Вы можете использовать groupby.cumcount.

df['sent_past'] = df.groupby('communication_type').cumcount()

print(df)

    user_id communication_type  sent_past
0         7         Newsletter          0
1         7         Newsletter          1
2         7         Newsletter          2
3         7         Newsletter          3
4         7         Conference          0
5         7    Upcoming Events          0
6         7    Upcoming Events          1
7         7    Upcoming Events          2
8         7         Conference          1
9         7         Conference          2
10        7            Webinar          0
11        7          Hackathon          0

Или для комбинаций user_id и communication_type использовать:

df['sent_past'] = df.groupby(['user_id', 'communication_type']).cumcount()
...