更新数据框列的有效方法

时间:2019-08-29 16:13:50

标签: python pandas

我有两个数据框:我们称它们为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进行此类计算所以我想提高效率。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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_trainuser_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