Introducere
Dacă sunteți unul dintre mulți utilizatori R care fac trecerea la python, s-ar putea să vă aflați în funcție de comoditatea unora dintre cele mai îndrăgite biblioteci ale lui R. La suprafață, saltul de la comoditatea și simplitatea lui R poate părea puțin descurajantă, deoarece peisajul python, deși amplu, poate produce adesea ceea ce par prea multe traduceri pentru o anumită piesă de funcționalitate. Nu este întotdeauna ușor să găsești traduceri directe.
Scopul acestui lucru este de a împărtăși o perspectivă informată despre metodele pe care să vă bazați pe măsură ce vă mutați fluxul de lucru la python.
Pentru acest articol, vom explora alternative la metodele convenabile ale dplyr pentru a efectua tot felul de îmbinări.
Rămâneți pe fază pentru alte articole care abordează unele dintre aceste întrebări cheie.
Ce vei învăța
Pentru acest articol, vom descompune traducerile primare pentru funcțiile de unire ale lui R din biblioteca dplyr.
Citind acest articol, vă puteți aștepta să învățați traduceri principale python pentru următoarele funcții:
- left_join
- right_join
- inner_join
- outer_join
- anti_join
- semi_join
Privire de ansamblu
Funcțiile de îmbinare sunt folosite pentru a combina două sau mai multe cadre de date pe baza unei coloane comune.
Mai jos este o trecere în revistă rapidă a diferitelor definiții
- left_join: returnează toate rândurile din tabelul din stânga și orice rânduri care se potrivesc din tabelul din dreapta
- right_join: returnează toate rândurile din tabelul din dreapta și orice rânduri care se potrivesc din tabelul din stânga
- inner_join: returnează numai înregistrările care apar în ambele tabele
- outer_join: Această funcție returnează toate rândurile din ambele tabele și completează toate valorile lipsă cu NA
- anti_join: Această funcție returnează toate rândurile din tabelul din stânga care nu au o potrivire în tabelul din dreapta.
- semi_join: Această funcție returnează toate rândurile din tabelul din stânga care au o potrivire în tabelul din dreapta.
Timp de comparație
Înainte de a interveni, vom folosi două exemple de cadre de date. Voi include codul pentru a genera aceste două exemple de cadre de date, astfel încât să puteți urmări:
# libraries import pandas as pd # sample df1 df1 = pd.DataFrame({ 'join_column': ['A', 'B', 'C', 'D'], 'col1': [10, 20, 30, 40], 'col2': [100, 200, 300, 400] }) # sample df2 df2 = pd.DataFrame({ 'join_column': ['B', 'D', 'E', 'F'], 'col3': ['X', 'Y', 'Z', 'W'], 'col4': ['P', 'Q', 'R', 'S'] })
Cu asta în afara drumului, să ne scufundăm
Left Join
R
În r vă puteți bucura de simplitatea și fluxul dplyr, specificați cadrul de date de interes, df1 în acest caz, și vă alăturați lui df2 pe câmpul comun
df3 <- df1 %>% left_join(df2, by = "join_column")
Piton
Din fericire, în python lucrurile nu sunt deloc diferite. Principala diferență este sintactică, merge versus left_join, on mai degrabă decât de și așa mai departe.
O altă diferență este că putem folosi .merge ca metodă în cadrul de date din stânga. Unul dintre aspectele interesante și mai convenabile ale îmbinării este parametrul how. Acest lucru ne permite să stabilim tipul de alăturare care ne interesează. Nu că ar fi atât de greu să ne amintim left_join, right_join, inner_join, dar hei... uneori trebuie să te bucuri de lucrurile simple.
df3 = df1.merge(df2, on = "join_column", how = "left")
O altă notă este că puteți apela și merge ca funcție, caz în care comanda ar arăta astfel:
df3 = pd.merge(df1, df2, on = "join_column", how = "left")
Nu foarte diferit, dar util să fii conștient de faptul că atât funcția, cât și metoda sunt de la panda și ambele sunt disponibile.
Rezultatul:
Alăturați-vă dreapta
Aproape de la sine explicabil, singurul lucru care se schimbă aici este că efectuăm o îmbinare corectă, de asemenea, același lucru cu schimbarea cadru de date pe care îl numim primul.
Vom parcurge exemplele aici.
R
Singurul lucru care se schimbă aici este funcția
df3 <- df1 %>% right_join(df2, by = "join_column")
Piton
df3 = df1.merge(df2, on = "join_column", how = "right")
Rezultatul:
Inner Join
Similar cu right join, următoarele câteva funcții sunt super simple, așa că vom trece rapid.
R
df3 <- df1 %>% inner_join(df2, by = "join_column")
Piton
df3 = df1.merge(df2, on = "join_column", how = "inner")
Rezultatul:
Unire exterioară
R
df3 <- df1 %>% outer_join(df2, by = "join_column")
Piton
df3 = df1.merge(df2, on = "join_column", how = "outer")
Anti Join
Aici este locul în care Python se implică puțin mai mult, dar în apărarea sa, anti join nu sunt cele mai comune.
R
df3 <- df1 %>% anti_join(df2, by = "join_column")
Piton
df3 = df1.merge(df2["join_column"], on = "join_column", how = "left", indicator=True) .query('_merge == "left_only"') .drop('_merge', 1)
Există câteva piese diferite de explicat aici.
Când populăm parametrul indicator la True, se adaugă o nouă coloană numită „_merge”, care, în cazul unei îmbinări la stânga, spune „left_only” sau „both”. După cum ați putea ghici, „left_only” înseamnă că nu a existat o potrivire în cadrul de date corect și, în cazul „ambele”, a existat o potrivire.
Indicăm True, astfel încât să putem folosi apoi .query pentru a specifica că vrem doar înregistrări care nu au fost găsite în cadrul de date corect.
Și, în sfârșit, ca un pic de curățare, aruncăm coloana „_merge”.
Și ultima piesă pe care o voi menționa, trebuie, de asemenea, să subsetăm cadrul de date corect doar în coloana de unire. În caz contrar, vom fi adăugat toate coloanele nule din cadrul de date din dreapta. Ceea ce ar fi inutil și împotriva utilizării tradiționale a anti_join.
După cum am spus, mult mai implicat, dar încă destul de simplu din punct de vedere conceptual.
Rezultatele:
Semi alăturați
Ca o reamintire, semi-uniunile sunt opusul anti_join. Vom returna doar înregistrări din cadrul de date din stânga în care există potriviri cu cadrul de date din dreapta.
De fapt, nimic nu se schimbă în R.
R
df3 <- df1 %>% anti_join(df2, by = "join_column")
Piton
Similar cu ceea ce am văzut mai sus cu anti join; totuși, în acest caz, interogăm unde _merge este egal cu „ambele”, ceea ce presupune că a existat o potrivire.
pd.merge(df1, df2['join_column'], on = "column_name", how = "left", indicator=True)\ .query('_merge == "both"')\ .drop('_merge', 1)
Concluzie:
Am parcurs o mulțime de teren rapid. Când vine vorba de alăturarea pașilor panda în mod similar cu dplyr în R. Am explorat traduceri simple și eficiente python pentru funcționalitatea de unire cheie în R, în special, dplyr.
Mai exact, am explorat următoarele tipuri de îmbinări:
- left_join
- right_join
- inner_join
- outer_join
- anti_join
- semi_join
Sperăm că acest articol se dovedește util. Spuneți-ne ce metode alternative utilizați în Python, mai degrabă decât funcționalitatea merge a panda.