Pandas bevölkern neuen dataframe Spalte auf Grundlage übereinstimmender Spalten in einer anderen dataframe

Ich habe eine df enthält meine wichtigsten Daten, die mit einer million rows. Meine wichtigsten Daten auch noch 30 columns. Jetzt möchte ich eine weitere Spalte hinzufügen, um meine df genannt category. Die category ist ein column im df2 enthält rund 700 rows und zwei andere columns zu entsprechen, wird mit zwei columns im df.

Beginne ich mit der Einstellung ein index im df2 und df zu entsprechen, wird zwischen den Rahmen, aber einige der index im df2 existiert nicht in df.

Werden die verbleibenden Spalten in df2 genannt AUTHOR_NAME und CATEGORY.

Der entsprechenden Spalte in df heißt AUTHOR_NAME.

Einige der AUTHOR_NAME im df existiert nicht in df2 - und Umgekehrt.

Die Anweisung, die ich will, ist: wenn index im df Spiele mit index im df2 und title im df Spiele mit title im df2 fügen Sie category zu df ist, sonst hinzufügen NaN in category.

Beispiel Daten:

df2
           AUTHOR_NAME              CATEGORY
Index       
Pub1        author1                 main
Pub2        author1                 main
Pub3        author1                 main
Pub1        author2                 sub
Pub3        author2                 sub
Pub2        author4                 sub


df
            AUTHOR_NAME     ...n amount of other columns        
Index       
Pub1        author1                 
Pub2        author1     
Pub1        author2 
Pub1        author3
Pub2        author4 

expected_result
            AUTHOR_NAME             CATEGORY   ...n amount of other columns
Index
Pub1        author1                 main
Pub2        author1                 main
Pub1        author2                 sub
Pub1        author3                 NaN
Pub2        author4                 sub

Wenn ich df2.merge(df,left_index=True,right_index=True,how='left', on=['AUTHOR_NAME']) meine df wird dreimal größer als es sein sollte.

Also dachte ich, vielleicht ist die Zusammenlegung der falsche Weg, um darüber zu gehen. Was ich bin wirklich versucht zu tun, ist mit df2 als lookup-Tabelle und zurück type Werte df je nachdem, ob bestimmte Bedingungen erfüllt sind.

def calculate_category(df2, d):
    category_row = df2[(df2["Index"] == d["Index"]) & (df2["AUTHOR_NAME"] == d["AUTHOR_NAME"])]
    return str(category_row['CATEGORY'].iat[0])

df.apply(lambda d: calculate_category(df2, d), axis=1)

Jedoch, dieses wirft mir einen Fehler:

IndexError: ('index out of bounds', u'occurred at index 7614')
Ich bin mir nicht sicher, ob on und left_index/right_index zusammen zu arbeiten. Vielleicht brauchen Sie on=['Index', 'AUTHOR_NAME'] (oder so ähnlich). Und ich nicht sicher, welche dataframe ist Links in df2.merge(df,...). Vielleicht brauchen Sie how="right" oder pd.merge(left=df, right=df2, ...)
Für mehr Informationen über die verschiedenen Facetten und Funktionen von den merge-join, concat-API, werfen Sie bitte einen Blick auf Pandas Zusammenführen 101.

InformationsquelleAutor user3471881 | 2016-10-02

Schreibe einen Kommentar