2016-04-10 4 views
1

Ich habe zwei Datenrahmen, einer enthält Bildschirmnamen/Anzeigenamen und ein anderer enthält Einzelpersonen, und ich versuche, einen dritten Datenrahmen zu erstellen, der alle Daten von jedem Datenrahmen in einer neuen Zeile für jedes Mal einen Nachnamen auf dem Bildschirm enthält Name/Anzeigename. Funktional wird dies eine Liste möglicher übereinstimmender Namen erstellen. Meine aktuellen Code, die sich perfekt, aber sehr langsam arbeitet, sieht wie folgt aus:Gibt es einen schnelleren Weg durch Listenverständnis, um durch zwei Datenrahmen zu iterieren?

# Original Social Media Screen Names 
# cols = 'userid','screen_name','real_name' 
usernames = pd.read_csv('social_media_accounts.csv') 

# List Of Individuals To Match To Accounts 
# cols = 'first_name','last_name' 
individuals = pd.read_csv('individuals_list.csv') 

userid, screen_name, real_name, last_name, first_name = [],[],[],[],[] 
for index1, row1 in individuals.iterrows(): 
    for index2, row2 in usernames.iterrows(): 
     if (row2['Screen_Name'].lower().find(row1['Last_Name'].lower()) != -1) | (row2['Real_Name'].lower().find(row1['Last_Name'].lower()) != -1): 
      userid.append(row2['UserID']) 
      screen_name.append(row2['Screen_Name']) 
      real_name.append(row2['Real_Name']) 
      last_name.append(row1['Last_Name']) 
      first_name.append(row1['First_Name']) 

cols = ['UserID', 'Screen_Name', 'Real_Name', 'Last_Name', 'First_Name'] 
index = range(0, len(userid)) 
match_list = pd.DataFrame(index=index, columns=cols) 
match_list = match_list.fillna('') 
match_list['UserID'] = userid 
match_list['Screen_Name'] = screen_name 
match_list['Real_Name'] = real_name 
match_list['Last_Name'] = last_name 
match_list['First_Name'] = first_name 

Weil ich die ganze Zeile aus jeder Spalte müssen, die Liste Verständnis Methoden, die ich versucht habe nicht zu funktionieren scheinen.

+0

Können Sie zeigen die Probe von zwei Datensätzen und die Ausgabe von Ihnen gesuchte? – Abbas

+0

Die Datensätze sind geradlinig: Benutzernamen hat 3 Spalten: Benutzer-ID (int), Screen-Name (Str Kleinbuchstaben keine Leerzeichen oder Sonderzeichen), real_name (str). Individuen haben 2 Spalten: Last_Name (str) und First_Name (str). Das Ziel besteht darin, einen Datenrahmen für alle Instanzen zu haben, in denen ein Bildschirmname oder ein Realname die gleiche Zeichenfolge wie eine Instanz von Nachname hat, und die Benutzer-ID, Bildschirmname, Realname, Nachname und Vorname für jedes dieser Vorkommen zu speichern. – whateveryousayiam

Antwort

0

Die Sache, die Sie wollen, ist, schneller durch einen Datenrahmen zu iterieren. Wenn Sie das mit einem Listenverständnis tun, werden Daten aus einem Pandas-Datenframe herausgenommen, mit Operationen in Python verarbeitet und dann wieder in einen Pandas-Dataframe eingefügt. Der schnellste Weg (derzeit mit kleinen Daten) wäre es, Pandas-Iterationsmethoden zu verwenden. Als nächstes wollen Sie mit 2 Datenframes arbeiten. Es gibt ein Werkzeug in Pandas namens join.

result = pd.merge(usernames, individuals, on=['Screen_Name', 'Last_Name']) 

Nach der Zusammenführung können Sie Ihre Filterung tun. Hier

ist die Dokumentation: http://pandas.pydata.org/pandas-docs/stable/merging.html