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)]
我创建了一个推荐系统。有 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)]