Я создал рекомендательную систему. Существует 2 блока данных - input_df и recommended_dfPython 3.x - Pandas применяются очень медленно
input_df - Данные, которые уже просматривали пользователи. Это ДФ используется для генерации рекомендаций
User_Name Viewed_Content_Name
User1 Content1
User1 Content2
User1 Content5
User2 Content1
User2 Content3
User2 Content5
User2 Content6
User2 Content8
Recommended_df - Dataframe содержания рекомендованных для пользователей
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
Approach 2 - Попробуйте проверить, имеет ли строка в рекомендациях_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
Второй подход, использующий применять быстрее, чем подход 1, но я все еще могу сделать то же самое быстрее в excel, если я использую функцию countifs. Как я могу скопировать его быстрее с помощью python?
Спасибо @Ted Petrou. Ваш подход сократил время вычисления от 100 секунд до 0,06 секунды. Действительно невероятно! –