我有两个数据框:我们称它们为group_user_log和group_user
group_user_log
user_id server_time session_id
1 2018-01-01 435
1 2018-01-01 435
1 2018-01-04 675
1 2018-01-05 454
1 2018-01-05 454
1 2018-01-06 920
group_train
user_id impression_time totalcount distinct_count
1 2018-01-03 0 0
1 2018-01-05 0 0
逻辑是从server_time小于impression_time的group_user_log中提取session_id的总数和不重复计数,并填充总数和不重复计数列。 group_train的预期输出为:
user_id impression_time totalcount distinct_count
1 2018-01-03 2 1
1 2018-01-05 3 2
我尝试逐行执行此操作,但是这很耗时,并且对于较大的数据帧而言效率很低,因为上面的数据是来自两个大型数据帧的特定user_id的子集,并且需要针对大量的user_id进行此类计算所以我想提高效率。
感谢您的帮助!
答案 0 :(得分:3)
使用groupby
,merge
和query
:
#merge on user_id and query for server_time<impression_time
m=group_user_log.merge(group_train,on='user_id').query('server_time<impression_time')
#groupby on user_id and impression_time and agg on size and nunique
(m.groupby(['user_id','impression_time'])['session_id'].agg(['size','nunique'])
.rename(columns={'size':'totalcount','nunique':'distinct_count'}))
totalcount distinct_count
user_id impression_time
1 2018-01-03 2 1
2018-01-05 3 2
然后您可以通过将group_train
和user_id
设置为索引来使用它来更新impression_time
:
group_train=group_train.set_index(['user_id','impression_time'])
group_train.update(m)
print(group_train) #.reset_index()
totalcount distinct_count
user_id impression_time
1 2018-01-03 2 1
2018-01-05 3 2