pd.merge() în pandas

Combinarea tabelelor pandas 1.0+

Unește două tabele după o coloană comună (de exemplu id-ul clientului), ca un JOIN din SQL: inner, left, right sau outer.

Sintaxă
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), indicator=False, validate=None)
left.merge(right, how='inner', on=None, ...)

Ce face pd.merge()

merge() combină rândurile a două tabele care au aceeași valoare într-o coloană cheie. De exemplu, un tabel de comenzi are id_client, iar un tabel de clienți are id_client și numele: după merge, fiecare comandă are și numele clientului.

Parametrul how spune ce rânduri păstrezi: "inner" (implicit) doar cheile care apar în ambele tabele, "left" toate rândurile din stânga, "right" toate din dreapta, "outer" toate din ambele. Unde nu există potrivire, valorile lipsă sunt NaN (de aceea o coloană de numere întregi poate deveni float64).

Dacă cheia are nume diferite în cele două tabele, folosește left_on și right_on. Coloanele cu același nume care nu sunt cheie primesc sufixe (_x, _y sau cele din suffixes). indicator=True adaugă coloana _merge, care spune de unde vine fiecare rând.

Parametri

Parametru Descriere
left, right Cele două tabele. Cu forma de metodă, left este tabelul pe care apelezi .merge().
how "inner" (implicit), "left", "right", "outer" sau "cross" (toate combinațiile).
on Coloana (sau lista de coloane) cheie, cu același nume în ambele tabele. Fără on, se folosesc toate coloanele comune.
left_on, right_on Coloanele cheie când au nume diferite în stânga și în dreapta.
left_index, right_index Cu True se folosește indexul tabelului respectiv drept cheie.
suffixes Sufixele pentru coloanele cu același nume care nu sunt cheie. Implicit ("_x", "_y").
indicator Cu True adaugă coloana _merge cu valorile left_only, right_only sau both.
validate Verifică tipul relației: "one_to_one", "one_to_many", "many_to_one". Dacă datele nu respectă regula, apare MergeError.

Ce returnează

Un DataFrame nou cu coloanele ambelor tabele. Tabelele inițiale nu se modifică.

Exemple

Exemplul 1: Comenzi cu numele clientului (inner)

Comanda clientului 4 nu are pereche în tabelul de clienți, iar Ioana (id 3) nu are comenzi, deci amândouă dispar la inner.

import pandas as pd

clienti = pd.DataFrame({
    "id_client": [1, 2, 3],
    "nume": ["Ana", "Mihai", "Ioana"],
    "oras": ["Iași", "Cluj", "Brașov"],
})
comenzi = pd.DataFrame({
    "nr": [101, 102, 103, 104],
    "id_client": [1, 2, 1, 4],
    "suma": [250, 120, 90, 300],
})

print(pd.merge(comenzi, clienti, on="id_client"))

Rezultat

    nr  id_client  suma   nume  oras
0  101          1   250    Ana  Iași
1  102          2   120  Mihai  Cluj
2  103          1    90    Ana  Iași

Exemplul 2: left, outer și coloana _merge

Cu how="left" rămân toți clienții; Ioana are NaN la comandă. Cu how="outer" apare și comanda clientului 4, iar indicator=True arată de unde vine fiecare rând.

import pandas as pd

clienti = pd.DataFrame({"id_client": [1, 2, 3], "nume": ["Ana", "Mihai", "Ioana"]})
comenzi = pd.DataFrame({"nr": [101, 102, 103, 104], "id_client": [1, 2, 1, 4]})

print(clienti.merge(comenzi, on="id_client", how="left"))
print()
print(clienti.merge(comenzi, on="id_client", how="outer", indicator=True))

Rezultat

   id_client   nume     nr
0          1    Ana  101.0
1          1    Ana  103.0
2          2  Mihai  102.0
3          3  Ioana    NaN

   id_client   nume     nr      _merge
0          1    Ana  101.0        both
1          1    Ana  103.0        both
2          2  Mihai  102.0        both
3          3  Ioana    NaN   left_only
4          4    NaN  104.0  right_only

Exemplul 3: Chei cu nume diferite și sufixe

Cheia se numește cod în stânga și cod_produs în dreapta. Ambele tabele au coloana pret, așa că primesc sufixele alese.

import pandas as pd

stoc = pd.DataFrame({"cod": ["A1", "B2", "C3"], "pret": [10.0, 25.5, 7.0]})
oferta = pd.DataFrame({"cod_produs": ["A1", "C3"], "pret": [8.5, 6.0]})

rez = stoc.merge(oferta, left_on="cod", right_on="cod_produs",
                 how="left", suffixes=("_vechi", "_nou"))
print(rez)

Rezultat

  cod  pret_vechi cod_produs  pret_nou
0  A1        10.0         A1       8.5
1  B2        25.5        NaN       NaN
2  C3         7.0         C3       6.0

Greșeli frecvente

  • Te aștepți ca merge să păstreze toate rândurile: implicit e how="inner", deci rândurile fără pereche dispar. Pentru a păstra tot tabelul din stânga folosește how="left".
  • Cheia are tipuri diferite în cele două tabele (de exemplu 1 ca număr și "1" ca text). merge dă ValueError; adu-le la același tip cu astype() înainte.
  • Cheia se repetă în ambele tabele și numărul de rânduri crește neașteptat (fiecare pereche se combină cu fiecare). Verifică cu validate="many_to_one" sau cu duplicated().

Comenzi înrudite

  • DataFrame.join(): Adaugă coloanele altui tabel potrivind rândurile după index, implicit păstrând toate rândurile tabelului din stânga.
  • pd.concat(): Lipește mai multe tabele unul sub altul (rânduri) sau unul lângă altul (coloane), de exemplu vânzările din mai multe luni.
  • duplicated() / drop_duplicates(): Găsește rândurile repetate și le elimină, după toate coloanele sau doar după cele alese, păstrând prima sau ultima apariție.
  • DataFrame.astype() și pd.to_numeric(): Schimbă tipul unei coloane (int, float, category, str); pd.to_numeric transformă textul în numere și poate pune NaN la valorile greșite.