繁体   English   中英

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

[英]More efficient way of filtering users on past behaviour

我有两个数据集:一个推荐输出和另一个活动数据集,这些数据集提供有关用户在过去两个月中浏览过的活动或内容的信息。

推荐数据样本

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添加到输出中。

当前的解决方案可以工作,但是就大型数据集而言,其效率极其低下。 实际的数据集有30,000+个用户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_ids添加一个虚拟变量,然后使用熊猫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

在下一版的熊猫(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

假设您有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()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM