Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更有效地过滤用户过去行为的方法_Python_Pandas - Fatal编程技术网

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
中添加一个虚拟变量,然后使用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

假设有两个数据帧

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代码中实现!!数据本身就是这样,我们只能在代码中完成这一点。