簡體   English   中英

根據 pandas DataFrame 中的一對列從輔助表中查找交集的最有效方法是什么?

[英]What's the most efficient way to find intersections from secondary tables based on a pair of columns in a pandas DataFrame?

我在 Pandas 中有 3 個數據幀:

UserItem 是用戶選擇的用戶和項目的 DataFrame,有 2 列,用戶和項目。

UserTag 是用戶和標簽的 DataFrame,有 2 列,用戶和標簽。

ItemTag 是項目和標簽的 DataFrame,有 2 列,項目和標簽。

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 ) 的 DataFrame,另外兩個大約有 500k 行。 所有可能的(用戶,項目)對的產品集約為 300 億 - 我不需要所有可能對的交集和並集,只需要 UserItem dataframe 中的那些。

利用:

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM