Python 3.x - Pandas 应用很慢

Python 3.x - Pandas apply is very slow

我创建了一个推荐系统。有 2 个数据框 - input_df 和 recommended_df

input_df – 用户已查看内容的数据框。此 df 用于生成推荐

User_Name   Viewed_Content_Name
User1   Content1
User1   Content2
User1   Content5
User2   Content1
User2   Content3
User2   Content5
User2   Content6
User2   Content8

Recommended_df – 推荐给用户的内容数据框

User_Name   Recommended_Content_Name
User1   Content1 # This recommendation has already been viewed by User1. Hence this recommendation should be removed
User1   Content8
User2   Content2
User2   Content7

我想删除已被用户查看过的推荐。我尝试了两种方法,但这两种方法都非常耗时。我需要一种方法来识别 input_df 和 recommended_df

中出现的行

方法 1 - 使用子集,对于 recommended_df 中的每一行,我尝试查看该行是否已经出现在 input_df

for i in range(len(recommended_df)):
    recommended_df.loc[i,'Recommendation_Completed']=len(input_df [(input_df ['User_Name']== recommended_df.loc[i,'User_Name']) & (input_df ['Viewed_Content_Name']== recommended_df.loc[i,'Recommended_Content_Name'])]) 

recommended_df = recommended_df.loc[recommended_df['Recommendation_Completed']==0]
# Remove row if already occured in input_df

方法 2 - 尝试使用 apply

查看 recommended_df 中的行是否出现在 input_df 中

在 input_df 和 recommended_df 中创建了一个键列。这是每个用户和内容的唯一密钥

Input_df =

User_Name   Viewed_Content_Name    keycol (User_Name + Viewed_Content_Name)
User1   Content1    User1Content1   
User1   Content2    User1Content2
User1   Content5    User1Content5
User2   Content1    User2Content1
User2   Content3    User2Content3
User2   Content5    User2Content5
User2   Content6    User2Content6
User2   Content8    User2Content8

Recommended_df =

User_Name   Recommended_Content_Name    keycol (User_Name + Recommended_Content_Name)
User1   Content1    User1Content1
User1   Content8    User1Content8
User2   Content2    User2Content2
User2   Content7    User2Content7

recommended_df ['Recommendation_Completed'] = recommended_df ['keycol'].apply(lambda d: d in input_df ['keycol'].values)

recommended_df = recommended_df.loc[recommended_df['Recommendation_Completed']==False]
# Remove if row occurs in input_df

使用 apply 的第二种方法比方法 1 更快,但如果我使用 countifs 函数,我仍然可以在 excel 中更快地做同样的事情。如何使用 python 更快地复制它?

尝试仅将申请用作最后的手段。您可以连接用户和内容,然后使用布尔选择。

user_content_seen = input_df.User_Name + input_df.Viewed_Content_Name

user_all = Recommended_df.User_Name + Recommended_df.Recommended_Content_Name

Recommended_df[~user_all.isin(user_content_seen)]