2016-12-20 7 views
0

Я создал рекомендательную систему. Существует 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?

ответ

2

Попробуйте использовать только в качестве последнего средства. Вы можете конкатенировать пользователя и контент, а затем использовать логический выбор.

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)] 
+0

Спасибо @Ted Petrou. Ваш подход сократил время вычисления от 100 секунд до 0,06 секунды. Действительно невероятно! –