Vasen ja oikea liitos
Tehkää vasen tai oikea liitos, joka säilyttää kaikki yhden taulukon rivit ja yhdistää niihin toisen taulukon vastaavat tietueet.
Vasen ja oikea liitos on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Epäsymmetriset liitokset
Sisäiset ja ulkoiset liitokset käsittelevät molempia DataFrame-kehyksiä symmetrisesti. Usein haluatte kuitenkin säilyttää kaikki yhden taulukon tietueet ja täydentää niitä toisen taulukon tiedoilla. Tällöin käytetään vasemmanpuoleisia liitoksia ja oikeanpuoleisia liitoksia. Nämä epäsymmetriset liitokset ovat analytiikassa erittäin yleisiä: säilytetään kaikki tapahtumat ja lisätään tuotteiden nimet, jos ne ovat saatavilla; säilytetään kaikki käyttäjät ja lisätään heidän viimeisin ostopäivänsä, jos sellainen on.
Vasen liitos: kaikkien vasemman puolen rivien säilyttäminen
Vasen liitos (how='left') säilyttää jokaisen rivin vasemmasta DataFrame-kehyksestä. Riveillä, joille löytyy vastaava avain oikeasta DataFrame-kehyksestä, oikean puolen sarakkeet täytetään vastaavilla arvoilla. Riveillä, joille vastaavuutta ei löydy, oikean puolen sarakkeet täytetään arvolla NaN. Tuloksen rivimäärä vastaa aina vasemman DataFrame-kehyksen rivimäärää (jos avaimissa ei ole kaksoiskappaleita).
import pandas as pd
orders = pd.DataFrame({
'order_id': [1, 2, 3, 4],
'customer_id': [101, 102, 101, 999],
'amount': [250, 80, 320, 150]
})
customers = pd.DataFrame({
'customer_id': [101, 102, 103],
'name': ['Alice', 'Bob', 'Carol']
})
result = pd.merge(orders, customers, on='customer_id', how='left')
print(result)
# All 4 orders kept; order with customer_id=999 gets NaN for nameVasemman liitoksen tuloksen rakenne
Vasemman liitoksen jälkeen vasemman DataFrame-kehyksen rivillä, jolle ei löytynyt vastaavuutta oikealta, on NaN jokaisessa oikeasta taulukosta peräisin olevassa sarakkeessa. Tämän avulla voitte tunnistaa täsmäämättömät rivit oikean taulukon sarakkeeseen kohdistuvalla totuusarvosuodattimella ja laskea, kuinka monelle vasemman puolen riville ei löytynyt vastaavuutta — tämä on hyödyllinen tietojen laadun tarkistus.
result = pd.merge(orders, customers, on='customer_id', how='left')
print(result)
# order_id customer_id amount name
# 0 1 101 250 Alice
# 1 2 102 80 Bob
# 2 3 101 320 Alice
# 3 4 999 150 NaN <- no matching customer
# Count unmatched
unmatched = result['name'].isna().sum()
print(f'{unmatched} orders have no customer record')Milloin vasenta liitosta kannattaa käyttää
Vasemmat liitokset sopivat tilanteisiin, joissa vasen DataFrame-kehys on ensisijainen taulukko ja oikea taulukko täydentävä. Yleisiä käyttötapauksia ovat faktataulukon täydentäminen dimensiotaulukolla (tilaukset + tuotteiden nimet), valinnaisten metatietojen lisääminen (käyttäjät + profiilitiedot) tai tunnuslukujen laskeminen kaikille tietueille, vaikka hakutoiminto ei tuottaisi tulosta. Useimmissa analytiikkakoodeissa vasemmat liitokset ovat paljon yleisempiä kuin oikeat liitokset.
# Realistic pattern: enrich all products with optional category data
products = pd.DataFrame({'sku': ['A1', 'B2', 'C3'], 'price': [10, 20, 15]})
categories = pd.DataFrame({'sku': ['A1', 'C3'], 'category': ['Tools', 'Home']})
# Keep all products; add category where available
enriched = pd.merge(products, categories, on='sku', how='left')
print(enriched)
# sku price category
# 0 A1 10 Tools
# 1 B2 20 NaN
# 2 C3 15 HomeOikea liitos: kaikkien oikean puolen rivien säilyttäminen
Oikea liitos (how='right') on vasemman liitoksen peilikuva: se säilyttää jokaisen rivin oikeasta DataFrame-kehyksestä ja täyttää vasemman taulukon sarakkeet arvolla NaN, jos vastaavuutta ei löydy. Oikea liitos on harvinaisempi, koska saman tuloksen saa aina vaihtamalla DataFrame-argumenttien järjestyksen ja käyttämällä vasenta liitosta, mikä on lukijalle selkeämpää.
# Right join: keep all customers, attach orders where they exist
result = pd.merge(orders, customers, on='customer_id', how='right')
print(result)
# All 3 customers appear; Carol (103) has NaN for order_id and amount
# Equivalent left join (swap arguments):
result2 = pd.merge(customers, orders, on='customer_id', how='left')
# Same data, just column order differsKaikkien neljän liitostyypin vertailu
Neljät liitostyypit eroavat toisistaan vain siinä, mitkä täsmäämättömän puolen rivit säilytetään. inner: vain täsmäävät rivit. outer: kaikki rivit molemmilta puolilta. left: kaikki vasemman puolen rivit. right: kaikki oikean puolen rivit. Täsmäämättömien tietueiden kohdalla puuttuvan puolen sarakkeet täytetään arvolla NaN. Oikean vaihtoehdon valinta on olennaista, jotta tietueita ei hylätä tai monisteta huomaamatta.
# Summary table
# how='inner' : rows in BOTH tables
# how='left' : ALL left rows + matched right
# how='right' : matched left + ALL right rows
# how='outer' : ALL left rows + ALL right rows
# Test each
for how in ['inner', 'left', 'right', 'outer']:
r = pd.merge(orders, customers, on='customer_id', how=how)
print(f'{how}: {len(r)} rows')NaN-arvojen täyttäminen vasemman liitoksen tuloksissa
Vasemman liitoksen jälkeen täsmäämättömillä riveillä on NaN oikean taulukon sarakkeissa. Usein nämä kannattaa korvata järkevillä oletusarvoilla — esimerkiksi arvolla 'Unknown', jos luokka puuttuu, tai arvolla 0, jos lukumäärä puuttuu. Käyttäkää tulokseen fillna()-funktiota tai välittäkää fill_value liitosta seuraaviin aritmeettisiin operaatioihin.
result = pd.merge(products, categories, on='sku', how='left')
result['category'] = result['category'].fillna('Uncategorised')
print(result)
# sku price category
# 0 A1 10 Tools
# 1 B2 20 Uncategorised
# 2 C3 15 HomeVasen anti-liitos: rivit, joille ei löydy vastaavuutta
Hyödyllinen kuvio, jota how ei suoraan tue, on anti-liitos: säilytetään vain vasemman puolen rivit, joille oikeasta taulukosta EI löydy vastaavuutta. Toteuttakaa se vasemman liitoksen avulla käyttäen asetusta indicator=True ja suodattamalla ehdolla _merge == 'left_only'. Tämä sopii erinomaisesti orpotietueiden, viiteluettelosta puuttuvien uusien kohteiden tai pääkirjasta puuttuvien tapahtumien etsimiseen.
# Anti-join: orders with no matching customer record
result = pd.merge(orders, customers, on='customer_id',
how='left', indicator=True)
unmatched_orders = result[result['_merge'] == 'left_only'].drop(columns='_merge')
print(unmatched_orders)
# order_id customer_id amount name
# 3 4 999 150 NaNRivimäärän säilyttäminen vasemmalla liitoksella
Kun oikean DataFrame-kehyksen avaimet ovat yksikäsitteisiä, vasen liitos säilyttää varmasti vasemman taulukon täsmällisen rivimäärän. Jos oikeassa taulukossa on kuitenkin avainarvojen kaksoiskappaleita, vasen liitos monistaa rivejä sisäisen liitoksen tavoin. Tarkistakaa aina, että tuloksen rivimäärä vastaa vasemman taulukon rivimäärää, kun odotatte yksi moneen -suhdetta.
# Right table has duplicate keys -> row multiplication
orders_small = pd.DataFrame({'id': [1, 2], 'amount': [100, 200]})
multi_customer = pd.DataFrame({
'id': [1, 1], # duplicate!
'contact': ['Alice', 'Alice2']
})
result = pd.merge(orders_small, multi_customer, on='id', how='left')
print(len(result)) # 3 rows! order 1 appears twice
print(result)Vasemman liitoksen käytännön esimerkki
Tässä on kokonainen käytännön työnkulku: aloittakaa tapahtumalokista, liittäkää siihen vasemmalla tuotekatalogi nimien hakemiseksi ja tehkää sitten toinen vasen liitos asiakastaulukkoon nimien hakemiseksi. Täyttäkää puuttuvien hakujen tulokset oletusarvoilla. Vasen liitosketju varmistaa, että jokainen tapahtumarivi säilyy, vaikka tuote- tai asiakastietue puuttuisi viitetaulukoista.
transactions = pd.DataFrame({
'txn_id': [1, 2, 3],
'cust_id': [10, 11, 99],
'prod_id': [20, 21, 20],
'total': [50, 30, 70]
})
custs = pd.DataFrame({'cust_id': [10, 11], 'cust_name': ['Alice', 'Bob']})
prods = pd.DataFrame({'prod_id': [20, 21], 'prod_name': ['Widget', 'Gadget']})
result = (
transactions
.merge(custs, on='cust_id', how='left')
.merge(prods, on='prod_id', how='left')
)
print(result)Vasemman ja sisäisen liitoksen valinta
Vasemman ja sisäisen liitoksen välinen valinta on liiketoimintalogiikkaa koskeva päätös: säilytetäänkö tietueet, joille ei löydy hakuvastaavuutta, vai hylätäänkö ne huomaamatta? Käyttäkää vasenta liitosta, kun puuttuvat hakuvastaavuudet ovat sallittuja ja haluatte säilyttää kaikki ensisijaiset tietueet. Käyttäkää sisäistä liitosta, kun puuttuva hakuvastaavuus tarkoittaa, että tietue on virheellinen ja se tulee jättää pois analyysistä. Dokumentoikaa aina, minkä vaihtoehdon valitsitte ja miksi.
# Left join: keep all transactions (some may have no product name)
result_left = pd.merge(transactions, prods, on='prod_id', how='left')
print('Left join rows:', len(result_left)) # same as transactions
# Inner join: only transactions with known product
result_inner = pd.merge(transactions, prods, on='prod_id', how='inner')
print('Inner join rows:', len(result_inner)) # may be fewerPikatarkistus
Testatkaa ymmärrystänne tämän oppitunnin vasemmista ja oikeista liitoksista.
Oppitunnin yhteenveto
Tässä oppitunnissa opitte, että vasen liitos säilyttää kaikki vasemman DataFrame-kehyksen rivit ja täyttää oikean puolen sarakkeet NaN-arvolla, jos vastaavuutta ei löydy; oikea liitos on sen peilikuva; anti-liitoskuvio, jossa käytetään asetusta indicator=True, löytää vasemman puolen rivit, joille ei löydy vastaavuutta oikealta; ja vasemman ja sisäisen liitoksen valinta on liiketoimintalogiikkaa koskeva päätös. Seuraavaksi tutustumme DataFrame-kehysten yhdistämiseen indeksin eikä sarakkeen perusteella.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Vasen ja oikea liitos” ilmainen?
Kyllä – oppitunnin ”Vasen ja oikea liitos” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Vasen ja oikea liitos”?
Tehkää vasen tai oikea liitos, joka säilyttää kaikki yhden taulukon rivit ja yhdistää niihin toisen taulukon vastaavat tietueet. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Vasen ja oikea liitos”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?
Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- pd.concat DataFrame-rakenteiden pinoamiseen
- pd.merge: sisä- ja ulkoliitokset
- Vasen ja oikea liitos
- Liittäminen indeksin perusteella