过滤用户过去行为的更有效方法

2024-09-28 21:23:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据集:一个是推荐输出,另一个是活动数据集,它提供了关于用户在过去2个月浏览过哪些活动或内容的信息。你知道吗

推荐数据示例

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

Tags: 数据用户id示例内容commonfinalrec
2条回答

假设有两个数据帧

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}})

以及

past_data = pd.DataFrame({'content': {0: 34, 1: 23, 2: 102, 3: 103, 4: 103, 5: 100},
 'id': {0: 1, 1: 5, 2: 2, 3: 2, 4: 3, 5: 6},
 'random': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5}})

可以在两个数据帧之间进行左连接

df = pd.merge(recommendation_df , past_data_df , how = 'left')

然后只获取具有null值的行,这些值存在于推荐数据帧中,而不存在于用户活动数据帧中

df.loc[df.random.isnull()]

您可以在useractivity_ids中添加一个伪变量,然后使用pandas merge进行比较和筛选。你知道吗

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

相关问题 更多 >