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 istfor 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?
Danke @Ted Petrou. Ihr Ansatz reduzierte die Rechenzeit von 100+ Sekunden auf 0,06 Sekunden. Wirklich unglaublich! –