我在熊猫中有3个数据框:
UserItem是用户和用户选择的项目的DataFrame,具有2列,即User和Item。
UserTag是一个由用户和标签组成的DataFrame,具有两列,即User和Tag。
ItemTag是项和标签的DataFrame,具有两列,即项和标签。
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中的每个(用户,项目)对计算该用户的标签与该项目的标签的交集(以及并集!)的大小。
Answer_df = pd.DataFrame({'user': ['A', 'B', 'B'] , 'item': ['i', 'j', 'k'], 'intersection': [1, 0, 1], 'union' : [1, 2, 2]})
最有效的方法是什么?这些是具有30M行(UserItem_df
)的数据帧,其他两个行约有50万行。所有可能的(用户,项目)对的乘积集大约为300亿-我不需要所有可能的对的交集和并集,仅需要UserItem数据帧中的对。
采用 :
# 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句