Pandas & NumPy Academy · Lektion

pd.merge: indre og ydre joins

Flet to DataFrames på en fælles nøglekolonne ved hjælp af indre og ydre joins, og forstå, hvilke rækker der bevares eller fjernes.

Lektion 2 af 413 trin

pd.merge: indre og ydre joins er en gratis Pandas & NumPy Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Pandas & NumPy Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.

Hvad er et join?

Et join kombinerer to DataFrames ved at matche rækker baseret på en fælles nøglekolonne — det samme koncept som SQL's JOIN-sætning. Pandas implementerer joins gennem pd.merge(). I modsætning til pd.concat(), som blot stabler data, justerer pd.merge() intelligent rækker fra to forskellige tabeller baseret på matchende værdier i en eller flere kolonner.

Den fælles nøglekolonne

For at et merge kan fungere, skal begge DataFrames have mindst én kolonne med fælles værdier — nøglekolonnen. For eksempel har en orders-tabel en customer_id-kolonne, og en customers-tabel har også en customer_id-kolonne. Et merge på customer_id føjer kundeoplysninger til hver rækkes ordre. Angiv nøglen med on-parameteren, når begge DataFrames har samme kolonnenavn.

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'customer_id': [101, 102, 101, 103],
    'amount': [250, 80, 320, 150]
})

customers = pd.DataFrame({
    'customer_id': [101, 102, 104],
    'name': ['Alice', 'Bob', 'Diana']
})

Inner join: Snittet af begge tabeller

Et inner join (standardindstillingen) beholder kun rækker, hvor nøgleværdien findes i begge DataFrames. Rækker i hver af tabellerne, som ikke har en matchende nøgle i den anden tabel, fjernes lydløst. I ordreeksemplet har kunde 103 og 104 ingen match i den anden tabel, så deres rækker udelades fra resultatet af inner joinet.

# Inner join (default): only matching rows from both
result = pd.merge(orders, customers, on='customer_id', how='inner')
print(result)
#    order_id  customer_id  amount   name
# 0         1          101     250  Alice
# 1         3          101     320  Alice
# 2         2          102      80    Bob
# Order 4 (customer 103) dropped - no match in customers
# Diana (customer 104) dropped - no match in orders

Outer join: Foreningsmængden af begge tabeller

Et outer join (how='outer') beholder alle rækker fra begge DataFrames. Hvis en række ikke har en matchende nøgle i den anden tabel, udfyldes de manglende kolonner med NaN. Det er nyttigt, når du vil have et komplet billede af begge datasæt og bevare poster, som ikke fandt et match.

result = pd.merge(orders, customers, on='customer_id', how='outer')
print(result)
#    order_id  customer_id  amount   name
# 0       1.0          101   250.0  Alice
# 1       3.0          101   320.0  Alice
# 2       2.0          102    80.0    Bob
# 3       4.0          103   150.0    NaN  <- order with unknown customer
# 4       NaN          104     NaN  Diana  <- customer with no orders

Merge på kolonner med forskellige navne

Når nøglekolonnen har et forskelligt navn i hver DataFrame, skal du bruge left_on og right_on i stedet for on. Pandas matcher rækker, hvor left_on i den venstre DataFrame er lig med right_on i den højre DataFrame. Begge nøglekolonner vises i resultatet; du kan slette den overflødige kolonne bagefter.

products = pd.DataFrame({
    'prod_id': [10, 20, 30],
    'name': ['Widget', 'Gadget', 'Doohickey']
})

order_lines = pd.DataFrame({
    'item_id': [10, 10, 20],
    'qty': [3, 1, 5]
})

result = pd.merge(order_lines, products,
                  left_on='item_id', right_on='prod_id')
print(result.drop(columns='prod_id'))
#    item_id  qty    name
# 0       10    3  Widget
# 1       10    1  Widget
# 2       20    5  Gadget

Merge på flere kolonner

Hvis du vil matche rækker på en kombination af kolonner (en sammensat nøgle), skal du sende en liste til on. Det er almindeligt, når én kolonne ikke er tilstrækkelig til et entydigt match, f.eks. ved merge på både year og region. Alle angivne kolonner skal matche samtidigt, for at en række inkluderes i resultatet.

targets = pd.DataFrame({
    'year': [2023, 2023, 2024],
    'region': ['East', 'West', 'East'],
    'target': [100, 150, 120]
})
actuals = pd.DataFrame({
    'year': [2023, 2024, 2024],
    'region': ['East', 'East', 'West'],
    'actual': [95, 115, 80]
})

result = pd.merge(targets, actuals, on=['year', 'region'], how='inner')
print(result)
#    year region  target  actual
# 0  2023   East     100      95
# 1  2024   East     120     115

Håndtering af overlappende kolonnenavne

Når begge DataFrames har en kolonne med samme navn (bortset fra nøglen), tilføjer Pandas suffikser for at skelne dem fra hinanden. Standarderne er _x (venstre) og _y (højre). Du kan tilpasse dem med suffixes-parameteren for at få mere sigende navne og undgå forvirring i resultatet.

df_a = pd.DataFrame({'id': [1, 2], 'value': [10, 20]})
df_b = pd.DataFrame({'id': [1, 2], 'value': [100, 200]})

# Default suffixes
print(pd.merge(df_a, df_b, on='id'))
#    id  value_x  value_y

# Custom suffixes
print(pd.merge(df_a, df_b, on='id', suffixes=('_budget', '_actual')))
#    id  value_budget  value_actual

Kontrol af uventede dubletter

En almindelig faldgrube ved merge er en uventet mangedobling af rækker. Hvis nøglekolonnen har dublerede værdier i begge DataFrames, producerer merge et kartesisk produkt af alle matchende rækker. Kontrollér altid antallet af rækker efter et merge: Hvis det er større end forventet, skal du undersøge dubletter i nøglekolonnen med df.duplicated(subset=['key']).sum().

# Both tables have duplicate keys -> cartesian product
left = pd.DataFrame({'id': [1, 1], 'val_l': ['a', 'b']})
right = pd.DataFrame({'id': [1, 1], 'val_r': ['x', 'y']})

result = pd.merge(left, right, on='id')
print(len(result))  # 4 rows! (2x2 cartesian product)
print(result)
#    id val_l val_r
# 0   1     a     x
# 1   1     a     y
# 2   1     b     x
# 3   1     b     y

validate-parameteren for sikkerheds skyld

Send validate-parameteren med for at håndhæve relationsbegrænsninger på merget og udløse en fejl, hvis de overtrædes. 'one_to_one' kræver entydige nøgler i begge tabeller, 'one_to_many' kræver entydige nøgler kun i den venstre tabel, og 'many_to_one' kun i den højre. Det er en fremragende defensiv kodningspraksis, som opdager problemer med datakvaliteten tidligt.

# Safe merge: validate that customer_id is unique in customers
try:
    result = pd.merge(orders, customers,
                      on='customer_id',
                      how='inner',
                      validate='many_to_one')
    print('Merge OK, shape:', result.shape)
except Exception as e:
    print('Merge error:', e)

Kontrol af dækning med indicator

Send indicator=True med for at føje en _merge-kolonne til resultatet, som viser, hvor hver række kommer fra: 'left_only', 'right_only' eller 'both'. Det er nyttigt efter et outer join til at identificere, hvilke poster der fandt et match, og hvilke der ikke gjorde, så du kan kontrollere datakvaliteten, før du sletter indicator-kolonnen.

result = pd.merge(orders, customers, on='customer_id',
                  how='outer', indicator=True)
print(result['_merge'].value_counts())
# both           3
# left_only      1  <- orders with no customer record
# right_only     1  <- customers with no orders

# Find unmatched orders
print(result[result['_merge'] == 'left_only'])

Opsummering af inner og outer

For at opsummere de to join-typer: inner join giver snittet — kun rækker med matchende nøgler i begge DataFrames. Outer join giver foreningsmængden — alle rækker fra begge DataFrames med NaN, hvor der ikke er noget match. For fuldstændighedens skyld bevarer left join alle rækker fra den venstre DataFrame, og right join bevarer alle rækker fra den højre DataFrame. Dem gennemgår vi i næste lektion.

# Quick reference
# how='inner'  -> intersection: only matched rows
# how='outer'  -> union: all rows from both, NaN for no match
# how='left'   -> all left rows + matched right rows
# how='right'  -> all right rows + matched left rows

# Most common: inner (default) for enrichment, left for preserving records

Hurtigt tjek

Test din forståelse af inner og outer joins med pd.merge fra denne lektion.

Opsummering af lektionen

I denne lektion lærte du: pd.merge() med how='inner' beholder kun matchende rækker fra begge DataFrames, mens how='outer' beholder alle rækker med NaN for rækker uden match; on angiver den fælles nøgle, mens left_on/right_on håndterer forskellige kolonnenavne; og indicator-parameteren hjælper med at kontrollere, hvilke rækker der matchede. Nu skal vi se på left og right joins, som bevarer alle rækker fra den ene side.

Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “pd.merge: indre og ydre joins” gratis?

Ja — hele teksten til “pd.merge: indre og ydre joins” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Pandas & NumPy Academy-kurset, skal du opgradere til CoddyKit PRO. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “pd.merge: indre og ydre joins”?

Flet to DataFrames på en fælles nøglekolonne ved hjælp af indre og ydre joins, og forstå, hvilke rækker der bevares eller fjernes. Du øver dig i Pandas & NumPy Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Pandas & NumPy Academy?

Der kræves ingen tidligere erfaring. Pandas & NumPy Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “pd.merge: indre og ydre joins”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Pandas & NumPy Academy-lektion?

Ja. Alle Pandas & NumPy Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. pd.concat til sammenstabling af DataFrames
  2. pd.merge: indre og ydre joins
  3. Venstre- og højre-joins
  4. Join på indekset
← Tilbage til Pandas & NumPy Academy