Łączenie ramek danych pandy według nazw kolumn

91

Mam dwie ramki danych z następującymi nazwami kolumn:

frame_1:
event_id, date, time, county_ID

frame_2:
countyid, state

Chciałbym uzyskać ramkę danych z następującymi kolumnami, dołączając (po lewej) na county_ID = countyid:

joined_dataframe
event_id, date, time, county, state

Nie wiem, jak to zrobić, jeśli kolumny, do których chcę dołączyć, nie są indeksami. Jaki jest najłatwiejszy sposób? Dzięki!

Alexis Eggermont
źródło

Odpowiedzi:

164

możesz użyć opcji left_on i right_on w następujący sposób:

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

Nie byłem pewien z pytania, czy chcesz scalić tylko wtedy, gdy klucz znajduje się w lewej ramce danych. Jeśli tak jest, zrobią to następujące czynności (powyższe spowoduje w efekcie scalenie wiele do wielu)

pd.merge(frame_1, frame_2, how='left', left_on='county_ID', right_on='countyid')
Woody Pride
źródło
1
Aby trochę to rozwinąć, jeśli chcesz określić indeks po jednej stronie, możesz użyć right_index=True.
Druckles
1
@Woody Co jeśli frame_1już ma county_IDjako indeks i frame_2ma już countyidjako indeks? Rozumiem mogę podstawić frame_1.reset_index()do frame_1(i takie same dla frame_2) w swojej odpowiedzi. Ale czy istnieje wydajniejszy sposób dołączania / łączenia bez resetowania indeksu?
Zhang18
3

musisz zrobić county_IDjako indeks dla prawej ramki:

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

dla twojej informacji, w pandach lewe sprzężenie przerywa się, gdy prawa ramka ma nieunikalne wartości w łączącej kolumnie. zobacz ten błąd .

więc musisz zweryfikować integralność przed dołączeniem przez , verify_integrity=True

behzad.nouri
źródło