pd.concat() în pandas

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.

Sintaxă
pd.concat(objs, *, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False)

Ce face pd.concat()

pd.concat() primește o listă de tabele sau serii și le lipește. Cu axis=0 (implicit) le pune unul sub altul: util când ai același tip de date în mai multe fișiere, de exemplu un CSV pe lună. Cu axis=1 le pune unul lângă altul, potrivind rândurile după index.

Indexul fiecărui tabel se păstrează, deci pot apărea etichete repetate (0, 1, 0, 1). ignore_index=True renumerotează rândurile de la 0. keys adaugă un nivel în index care spune din ce tabel vine fiecare rând.

Dacă tabelele au coloane diferite, implicit (join="outer") se păstrează toate coloanele, iar valorile care lipsesc devin NaN. Cu join="inner" rămân doar coloanele comune. concat a înlocuit vechea metodă DataFrame.append, eliminată în pandas 2.0.

Parametri

Parametru Descriere
objs Lista (sau dicționarul) de DataFrame/Series de lipit. Cu un dicționar, cheile lui devin keys.
axis 0 (implicit): unul sub altul. 1: unul lângă altul.
join "outer" (implicit) păstrează toate etichetele de pe cealaltă axă; "inner" doar pe cele comune.
ignore_index Cu True rezultatul primește un index nou 0, 1, 2, …
keys Etichete pentru fiecare tabel, puse ca nivel exterior în index (sau în coloane la axis=1).
names Numele nivelurilor din indexul creat cu keys.
verify_integrity Cu True dă eroare dacă rezultatul are etichete repetate în index.

Ce returnează

Un DataFrame (sau o Series, dacă ai lipit doar serii pe axis=0).

Exemple

Exemplul 1: Două luni unul sub altul

Fără ignore_index, indexul ar fi 0, 1, 0, 1. Cu ignore_index=True rândurile sunt numerotate din nou de la 0 la 3.

import pandas as pd

ianuarie = pd.DataFrame({"vanzator": ["Ana", "Mihai"], "suma": [1200, 800]})
februarie = pd.DataFrame({"vanzator": ["Ana", "Ioana"], "suma": [950, 1100]})

print(pd.concat([ianuarie, februarie]))
print()
print(pd.concat([ianuarie, februarie], ignore_index=True))

Rezultat

  vanzator  suma
0      Ana  1200
1    Mihai   800
0      Ana   950
1    Ioana  1100

  vanzator  suma
0      Ana  1200
1    Mihai   800
2      Ana   950
3    Ioana  1100

Exemplul 2: keys: de unde vine fiecare rând

keys adaugă un nivel exterior în index. Cu .loc["feb"] extragi apoi doar rândurile din februarie.

import pandas as pd

ianuarie = pd.DataFrame({"vanzator": ["Ana", "Mihai"], "suma": [1200, 800]})
februarie = pd.DataFrame({"vanzator": ["Ana", "Ioana"], "suma": [950, 1100]})

total = pd.concat([ianuarie, februarie], keys=["ian", "feb"], names=["luna", "rand"])
print(total)
print()
print(total.loc["feb"])

Rezultat

          vanzator  suma
luna rand               
ian  0         Ana  1200
     1       Mihai   800
feb  0         Ana   950
     1       Ioana  1100

     vanzator  suma
rand               
0         Ana   950
1       Ioana  1100

Exemplul 3: Unul lângă altul (axis=1) și coloane diferite

Cu axis=1 rândurile se potrivesc după index: Radu nu are absențe, deci primește NaN. În a doua parte, tabelele au coloane diferite, iar join="inner" păstrează doar coloana comună.

import pandas as pd

note = pd.DataFrame({"nota": [9, 7, 10]}, index=["Ana", "Mihai", "Radu"])
absente = pd.DataFrame({"absente": [2, 5]}, index=["Ana", "Mihai"])
print(pd.concat([note, absente], axis=1))
print()

a = pd.DataFrame({"nume": ["Ana"], "oras": ["Iași"]})
b = pd.DataFrame({"nume": ["Dan"], "varsta": [30]})
print(pd.concat([a, b], ignore_index=True))
print()
print(pd.concat([a, b], join="inner", ignore_index=True))

Rezultat

       nota  absente
Ana       9      2.0
Mihai     7      5.0
Radu     10      NaN

  nume  oras  varsta
0  Ana  Iași     NaN
1  Dan   NaN    30.0

  nume
0  Ana
1  Dan

Greșeli frecvente

  • Dai tabelele ca argumente separate: pd.concat(df1, df2). Primul argument trebuie să fie o listă: pd.concat([df1, df2]).
  • Folosești df.append(alt_df) din tutoriale vechi: metoda a fost eliminată în pandas 2.0 și dă AttributeError. Folosește pd.concat.
  • Adaugi rânduri unul câte unul cu concat într-o buclă. Fiecare apel copiază tot tabelul; strânge datele într-o listă și apelează concat o singură dată la final.
  • Uiți de indexul repetat după lipire și df.loc[0] întoarce mai multe rânduri. Folosește ignore_index=True.

Comenzi înrudite

  • pd.merge(): Unește două tabele după o coloană comună (de exemplu id-ul clientului), ca un JOIN din SQL: inner, left, right sau outer.
  • DataFrame.join(): Adaugă coloanele altui tabel potrivind rândurile după index, implicit păstrând toate rândurile tabelului din stânga.
  • pd.read_csv(): Citește un fișier CSV (valori separate prin virgulă sau alt separator) într-un DataFrame.
  • pd.DataFrame(): Creează un tabel cu rânduri și coloane, dintr-un dicționar de liste, dintr-o listă de dicționare sau dintr-o listă de liste.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: pd.concat()

Ai o nelămurire despre utilizarea comenzii pd.concat() sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.