基于数据帧中的一对列从辅助表中查找交点的最有效方法是什么?

2024-10-03 21:27:47 发布

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

我在熊猫中有3个数据帧:

UserItem是用户选择的用户和项目的数据框架,有两列,即User和Item

UserTag是一个包含用户和标记的数据框架,有两列,即用户和标记

ItemTag是项目和标记的数据框架,有两列,项目和标记

UserItem_df = pd.DataFrame({'user': ['A', 'B', 'B']      ,  'item': ['i', 'j', 'k']})
UserTag_df  = pd.DataFrame({'user': ['A', 'B']           ,  'tag' : ['T', 'R']})
ItemTag_df  = pd.DataFrame({'item': ['i', 'j', 'k', 'k'] ,  'tag' : ['T', 'S', 'T', 'R']})

我想为UserItem中的每个(user,item)对计算该用户的标记与该项的标记的交叉点(以及并集!)的大小

Answer_df = pd.DataFrame({'user': ['A', 'B', 'B']  , 'item': ['i', 'j', 'k'], 'intersection':  [1, 0, 1], 'union' : [1, 2, 2]})

最有效的方法是什么?这些数据帧有3000万行(UserItem_df),另外两个数据帧大约有500万行。所有可能(用户、项目)对的乘积集大约为300亿-我不需要所有可能对的交集和并集,只需要UserItem数据框中的那些


Tags: 数据项目用户标记框架dataframedftag
1条回答
网友
1楼 · 发布于 2024-10-03 21:27:47

使用:

# step 1:
df1 = pd.merge(UserItem_df, UserTag_df, on='user')

# step 2:
df2 = pd.merge(UserItem_df, ItemTag_df, on='item')

# step 3
df3 = pd.concat([df1, df2], ignore_index=True)

# step 4
df3 = (
    df3.groupby(['user', 'item'])['tag']
    .agg(intersection='count', union='nunique')
    .reset_index()
)
df3['intersection'] -= df3['union']

步骤:

# step 1: df1
  user item tag
0    A    i   T
1    B    j   R
2    B    k   R

# step 2: df2
  user item tag
0    A    i   T
1    B    j   S
2    B    k   T
3    B    k   R

# step 3: df3
  user item tag
0    A    i   T
1    B    j   R
2    B    k   R
3    A    i   T
4    B    j   S
5    B    k   T
6    B    k   R

# step 4: df3
  user item  intersection  union
0    A    i             1      1
1    B    j             0      2
2    B    k             1      2

相关问题 更多 >