DataFrame.assign() și coloane noi în pandas

Adaugă coloane calculate: df["col"] = ... modifică tabelul, iar assign() returnează un tabel nou și acceptă funcții lambda.

Sintaxă
df.assign(**coloane)
df["coloana_noua"] = valori

Ce face DataFrame.assign() și coloane noi

Cel mai simplu mod de a adăuga o coloană este atribuirea: df["total"] = df["pret"] * df["cantitate"]. Calculul se face pe toată coloana deodată, fără buclă. Poți da și o valoare fixă, care se repetă pe toate rândurile.

assign() face același lucru, dar nu modifică tabelul inițial: returnează unul nou. Numele argumentelor devin numele coloanelor. O valoare poate fi o funcție (de obicei lambda d: ...) care primește tabelul de până atunci, deci poți folosi coloane create în același apel sau la pașii anteriori dintr-un lanț de metode.

Pentru nume de coloane cu spații sau diacritice care nu pot fi argumente Python, folosește un dicționar despachetat: df.assign(**{"preț cu TVA": ...}).

Parametri

Parametru Descriere
**coloane Perechi nume=valoare. Valoarea poate fi un Series, o listă de aceeași lungime, o valoare fixă sau o funcție care primește tabelul și returnează coloana.

Ce returnează

assign() returnează un DataFrame nou cu coloanele adăugate (sau înlocuite). Atribuirea df["col"] = ... modifică tabelul și nu returnează nimic.

Exemple

Exemplul 1: Coloană nouă prin atribuire

import pandas as pd

cos = pd.DataFrame({
    "produs": ["pâine", "lapte", "mere"],
    "pret": [4.5, 7.0, 6.0],
    "cantitate": [2, 1, 3],
})

cos["total"] = cos["pret"] * cos["cantitate"]
cos["magazin"] = "Iași"
print(cos)
print("De plată:", cos["total"].sum(), "lei")

Rezultat

  produs  pret  cantitate  total magazin
0  pâine   4.5          2    9.0    Iași
1  lapte   7.0          1    7.0    Iași
2   mere   6.0          3   18.0    Iași
De plată: 34.0 lei

Exemplul 2: assign cu lambda, într-un lanț

A doua coloană folosește prima, creată în același apel. Tabelul cos rămâne neschimbat.

import pandas as pd

cos = pd.DataFrame({
    "produs": ["pâine", "lapte", "mere"],
    "pret": [4.5, 7.0, 6.0],
    "cantitate": [2, 1, 3],
})

rezultat = (
    cos.assign(
        total=lambda d: d["pret"] * d["cantitate"],
        tva=lambda d: (d["total"] * 0.21).round(2),
    )
    .assign(**{"total cu TVA": lambda d: d["total"] + d["tva"]})
)
print(rezultat)
print()
print(list(cos.columns))

Rezultat

  produs  pret  cantitate  total   tva  total cu TVA
0  pâine   4.5          2    9.0  1.89         10.89
1  lapte   7.0          1    7.0  1.47          8.47
2   mere   6.0          3   18.0  3.78         21.78

['produs', 'pret', 'cantitate']

Greșeli frecvente

  • Apelezi df.assign(...) fără să păstrezi rezultatul și crezi că tabelul s-a schimbat. Scrie df = df.assign(...).
  • Într-un lanț de metode folosești df["col"] în loc de lambda d: d["col"]. Expresia cu df se referă la tabelul vechi, nu la cel din lanț, și coloanele noi nu există în el.
  • Dai o listă de altă lungime decât numărul de rânduri: df["x"] = [1, 2] pe un tabel cu 3 rânduri aruncă ValueError.

Comenzi înrudite

  • DataFrame.apply() și Series.apply(): Aplică o funcție pe fiecare valoare a unei coloane sau pe fiecare coloană / rând al unui tabel (axis=1 pentru rânduri).
  • Series.map() și DataFrame.map(): Înlocuiește fiecare valoare după un dicționar sau o funcție (Series.map); DataFrame.map aplică o funcție pe fiecare celulă.
  • DataFrame.drop(): Elimină coloane (columns=) sau rânduri (index=) după nume și returnează un tabel nou.
  • DataFrame.rename(): Schimbă numele coloanelor sau etichetele rândurilor, cu un dicționar {vechi: nou} sau cu o funcție precum str.lower.
  • 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.