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
mergesă păstreze toate rândurile: implicit ehow="inner", deci rândurile fără pereche dispar. Pentru a păstra tot tabelul din stânga foloseștehow="left". - Cheia are tipuri diferite în cele două tabele (de exemplu
1ca număr și"1"ca text).mergedăValueError; adu-le la același tip cuastype()î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 cuduplicated().
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.