2016-12-20 5 views
0

Ich habe ein Empfehlungssystem erstellt. Es gibt 2 Datenrahmen - input_df und recommended_dfPython 3.x - Pandas anwenden ist sehr langsam

input_df - Datenrahmen des bereits von den Benutzern angesehenen Inhalts. Datenrahmen von Inhalten an Benutzer

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 

Ich möchte Empfehlungen empfohlen entfernen, wenn sie bereits vom Benutzer angesehen - Diese df zur Erzeugung der Empfehlungen

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

Recommended_df verwendet. Ich habe versucht, zwei Ansätze zu verfolgen, aber beide sind sehr zeitaufwendig. Ich brauche ein Konzept, das Auftreten von Zeilen in input_df identifizieren und recommended_df

Ansatz 1 - Mit subsetting für jede Zeile in recommended_df, versuche ich zu sehen, ob diese Zeile bereits in input_df

aufgetreten ist
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 

Ansatz 2 - Versuchen Sie zu sehen, ob die Zeile in recommended_df in input_df mit apply erscheint.

Eine Schlüsselspalte in input_df und recommended_df erstellt. Dies ist eindeutiger Schlüssel für jeden Benutzer und Inhalt

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 

Der zweite Ansatz anwenden mit schneller ist als Ansatz 1, aber ich kann immer noch die gleiche Sache schneller in Excel, wenn ich die Countifs-Funktion verwende. Wie kann ich es mit Python schneller replizieren?

Antwort

2

Versuchen Sie, nur als letzten Ausweg zu verwenden. Sie können Benutzer und Inhalt verketten und dann die boolesche Auswahl verwenden.

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

Danke @Ted Petrou. Ihr Ansatz reduzierte die Rechenzeit von 100+ Sekunden auf 0,06 Sekunden. Wirklich unglaublich! –