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. Scriedf = df.assign(...). - Într-un lanț de metode folosești
df["col"]în loc delambda d: d["col"]. Expresia cudfse 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.