Verbinden von Pandas-Datenrahmen durch Spaltennamen


85

Ich habe zwei Datenrahmen mit den folgenden Spaltennamen:

frame_1:
event_id, date, time, county_ID

frame_2:
countyid, state

Ich möchte einen Datenrahmen mit den folgenden Spalten erhalten, indem ich (links) auf county_ID = countyid:

joined_dataframe
event_id, date, time, county, state

Ich kann nicht herausfinden, wie es geht, wenn die Spalten, denen ich beitreten möchte, nicht der Index sind. Was ist der einfachste Weg? Vielen Dank!

Antworten:


158

Sie können die Optionen left_on und right_on wie folgt verwenden:

pd.merge(frame_1, frame_2, left_on='county_ID', right_on='countyid')

Ich war mir bei der Frage nicht sicher, ob Sie nur zusammenführen wollten, wenn sich der Schlüssel im linken Datenrahmen befand. Wenn dies der Fall ist, wird dies im Folgenden ausgeführt (das oben Gesagte führt tatsächlich zu einer Zusammenführung von vielen zu vielen).

pd.merge(frame_1, frame_2, how='left', left_on='county_ID', right_on='countyid')

1
Um dies ein wenig zu erweitern, können Sie verwenden, wenn Sie einen Index auf einer Seite angeben möchten right_index=True.
Druckles

1
@Woody Was ist, wenn frame_1bereits county_IDals Index und frame_2bereits countyidals Index? Ich verstehe , kann ich Ersatz frame_1.reset_index()für frame_1(und gleiche gilt für frame_2) in Ihrer Antwort. Aber gibt es eine effizientere Möglichkeit zum Beitreten / Zusammenführen, ohne den Index zurückzusetzen?
Zhang18

3

Sie müssen county_IDals Index für den richtigen Frame erstellen:

frame_2.join ( frame_1.set_index( [ 'county_ID' ], verify_integrity=True ),
               on=[ 'countyid' ], how='left' )

Zu Ihrer Information: Bei Pandas wird der linke Join unterbrochen, wenn der rechte Frame nicht eindeutige Werte in der Join-Spalte enthält. siehe diesen Fehler .

Sie müssen also die Integrität überprüfen, bevor Sie Mitglied werden , verify_integrity=True

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.