![](/img/trans.png)
[英]What's the most efficient way to drop columns (from beginning and end) in pandas from a large 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.