Python 更有效地过滤用户过去行为的方法
我有两个数据集:一个是推荐输出,另一个是活动数据集,它提供了关于用户在过去两个月内浏览了哪些活动或内容的信息 推荐数据样本Python 更有效地过滤用户过去行为的方法,python,pandas,Python,Pandas,我有两个数据集:一个是推荐输出,另一个是活动数据集,它提供了关于用户在过去两个月内浏览了哪些活动或内容的信息 推荐数据样本 id content 1 100 1 101 2 102 2 103 3 103 4 105 示例用户活动数据 id content 1 34 5 23 2 102 2 103 3 103
id content
1 100
1 101
2 102
2 103
3 103
4 105
示例用户活动数据
id content
1 34
5 23
2 102
2 103
3 103
6 100
我的目标是从用户的推荐数据集中删除这些内容,如活动数据集中所示,用户在过去2个月内已经看到了这些内容。现在,我获取这两个数据集之间的公共id,对于公共id,我为每个id提取两个数据的子集,并添加末尾,将不常见的id添加到输出中
目前的解决方案是可行的,但在大数据集方面效率极低。实际数据集有30000多个用户ID。如果有人能在列表理解或任何其他方法方面提供帮助,将不胜感激
common_muids = list(set(useractivity_ids).intersection(reco_ids))
final_rec1 = reco[reco.masteruserid.isin(common_muids)]
final_rec2 = reco[~(reco.masteruserid.isin(common_muids))]
d=DataFrame()
for i in common_muids:
final_rec_reduced=final_rec1[final_rec1.id==i]
useractivity_reduced=useractivity[useractivity.id==i]
useractivity_reduced_tbids=useractivity_reduced.tbid.unique().tolist()
final_rec_reduced=final_rec_reduced[~( final_rec_reduced.tbid.isin(useractivity_reduced_tbids))]
d=d.append(final_rec_reduced)
最后:
d=d.append(final_rec2)
最终输出为:
id tbid
1 100
1 101
4 105
您可以在
useractivity\u id
中添加一个虚拟变量,然后使用pandasmerge
进行比较和筛选
In [35]: useractivity_ids['tracker'] = 1
In [39]: reco_ids = reco_ids.merge(useractivity_ids, how='left')
In [40]: reco_ids[reco_ids['tracker'].isnull()].drop('tracker', axis=1)
Out[40]:
id content
0 1 100
1 1 101
5 4 105
在pandas(0.17)的下一个版本中,merge
有一个indicator
关键字,可以在不使用伪变量的情况下执行此操作
In [47]: (pd.merge(reco_ids, useractivity_ids, how='left', indicator=True)
.query('_merge == "left_only"'))
Out[47]:
id content _merge
0 1 100 left_only
1 1 101 left_only
5 4 105 left_only
假设有两个数据帧
recommendation_df = pd.DataFrame({'content': {0: 100, 1: 101, 2: 102, 3: 103, 4: 103, 5: 105},
'id': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 4}})
df = pd.merge(recommendation_df , past_data_df , how = 'left')
及
可以在两个数据帧之间进行左连接
recommendation_df = pd.DataFrame({'content': {0: 100, 1: 101, 2: 102, 3: 103, 4: 103, 5: 105},
'id': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 4}})
df = pd.merge(recommendation_df , past_data_df , how = 'left')
然后只获取具有null
值的行,这些值存在于推荐数据框中,不存在于用户活动数据框中
df.loc[df.random.isnull()]
听起来像是您希望在数据库引擎中实现的东西,而不是python代码。不,我只想在python代码中实现!!数据本身就是这样,我们只能在代码中完成这一点。