DataFrame列更新的高效方法

3
我有两个数据框:分别称为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

逻辑是从group_user_log中获取session_id的总计数和唯一计数,其中server_time小于impression_time,并填充总计数和唯一计数列。 group_train的期望输出如下:

user_id  impression_time  totalcount  distinct_count
1         2018-01-03      2               1
1         2018-01-05      3               2       

我试过逐行处理,但对于较大的数据框来说,这是耗时且效率非常低下的,因为上面的数据是从两个大数据框中针对特定用户ID的子集,需要对大量的用户ID进行这样的计算,所以我希望能够提高效率。

感谢您的帮助!


你想要不同的日期还是不同的会话ID? - user3483203
嗨,我想要获取不同的session_id。 - ChandanJha
可能是Pandas聚合计数不同的重复问题。 - G. Anderson
1个回答

3

通过 groupbymergequery

#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_idimpression_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

让我们在聊天中继续这个讨论。 - ChandanJha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接