Ce face fillna() / ffill() / bfill()
fillna(valoare) înlocuiește fiecare valoare lipsă cu valoarea dată. Cu un dicționar ({"oras": "necunoscut", "varsta": 0}) alegi altă valoare pe fiecare coloană. Poți da și o serie, de exemplu media calculată cu df["nota"].mean().
ffill() (forward fill) completează o lipsă cu ultima valoare cunoscută de deasupra, iar bfill() (backward fill) cu următoarea valoare de dedesubt. Sunt utile la serii în timp: temperatura de ieri rămâne valabilă azi, dacă azi nu s-a măsurat. Varianta veche fillna(method="ffill") a fost eliminată: în pandas 3 folosești direct ffill() și bfill().
Metodele întorc un tabel nou. Pentru a păstra rezultatul, îl atribui: df["nota"] = df["nota"].fillna(0).
Parametri
| Parametru | Descriere |
|---|---|
value |
Valoarea de completare: un scalar, un dicționar {coloană: valoare}, o Series sau un DataFrame (aliniate după etichete). |
limit |
Numărul maxim de valori lipsă completate (la ffill/bfill: câte lipsuri consecutive se completează). |
axis |
Axa pe care se completează. La ffill/bfill, axis=1 copiază valoarea din coloana din stânga/dreapta. |
limit_area |
Doar la ffill/bfill (pandas 2.2+): "inside" completează doar golurile dintre valori, "outside" doar cele de la margini. |
Ce returnează
Un obiect nou de același tip (DataFrame sau Series), cu valorile lipsă completate.
Exemple
Exemplul 1: O valoare fixă și un dicționar pe coloane
Pe coloana numerică varsta, fillna(0) pune 0 în locul lipsei. Cu dicționarul completezi fiecare coloană cu o valoare potrivită tipului ei: orașul lipsă devine „necunoscut”, iar vârsta lipsă devine 0.
import pandas as pd
df = pd.DataFrame({
"nume": ["Ana", "Mihai", "Ioana"],
"oras": ["Iași", None, "Cluj"],
"varsta": [25, 31, None],
})
print(df["varsta"].fillna(0))
print()
print(df.fillna({"oras": "necunoscut", "varsta": 0}))
Rezultat
0 25.0
1 31.0
2 0.0
Name: varsta, dtype: float64
nume oras varsta
0 Ana Iași 25.0
1 Mihai necunoscut 31.0
2 Ioana Cluj 0.0
Exemplul 2: Completarea cu media coloanei
Media notelor existente este (9 + 7 + 8) / 3 = 8. Nota lipsă a Ioanei devine 8.0. Rezultatul se atribuie înapoi coloanei.
import pandas as pd
df = pd.DataFrame({
"elev": ["Ana", "Mihai", "Ioana", "Radu"],
"nota": [9.0, 7.0, None, 8.0],
})
media = df["nota"].mean()
df["nota"] = df["nota"].fillna(media)
print(media)
print(df)
Rezultat
8.0
elev nota
0 Ana 9.0
1 Mihai 7.0
2 Ioana 8.0
3 Radu 8.0
Exemplul 3: ffill și bfill pe temperaturi zilnice
ffill() repetă ultima temperatură cunoscută; prima zi rămâne lipsă, pentru că nu are nimic deasupra. bfill() folosește valoarea următoare. Cu limit=1 se completează doar prima lipsă dintr-un șir.
import pandas as pd
temp = pd.Series(
[None, 12.0, None, None, 15.0],
index=["luni", "marți", "miercuri", "joi", "vineri"],
name="Iași",
)
rez = pd.DataFrame({
"inițial": temp,
"ffill": temp.ffill(),
"bfill": temp.bfill(),
"ffill_1": temp.ffill(limit=1),
})
print(rez)
Rezultat
inițial ffill bfill ffill_1
luni NaN NaN 12.0 NaN
marți 12.0 12.0 12.0 12.0
miercuri NaN 12.0 15.0 12.0
joi NaN 12.0 15.0 NaN
vineri 15.0 15.0 15.0 15.0
Greșeli frecvente
- Scrii
df.fillna(method="ffill")din tutoriale vechi. În pandas 3 parametrulmethodnu mai există și primeștiTypeError; foloseștedf.ffill(). - Folosești
df["nota"].fillna(0, inplace=True): cu Copy-on-Write (mereu activ în pandas 3), modificarea pe o coloană extrasă nu ajunge îndf, iar pandas afișeazăChainedAssignmentError. Metodele întorc un tabel nou, deci atribuie rezultatul:df["nota"] = df["nota"].fillna(0). - Apelezi
df.fillna(0)pe tot tabelul când ai și coloane de text: în pandas 3.1, un număr pus într-o coloanăstrafișeazăPandas4Warning, iar într-o versiune viitoare va da eroare. Folosește un dicționar cu o valoare potrivită pentru fiecare coloană. - Completezi cu 0 o coloană în care 0 are alt sens (de exemplu o temperatură). Uneori media,
ffill()sau păstrarea valorii lipsă dau un rezultat mai corect.
Comenzi înrudite
isna() / notna(): Arată care valori lipsesc (NaN, None, NaT) dintr-un tabel; cu isna().sum() afli câte lipsesc în fiecare coloană.dropna(): Șterge rândurile (sau coloanele) care au valori lipsă: oricare, doar complet goale sau doar în anumite coloane.groupby().transform(): Calculează o valoare pe grup (suma, media) și o pune înapoi pe fiecare rând, ca să o poți folosi ca o coloană nouă.DataFrame.resample(): Grupează o serie de timp pe intervale (săptămâni, luni) și calculează câte o valoare pe interval: sumă, medie, număr.
Întrebări & Exemple de Cod:
fillna() / ffill() / bfill()Ai o nelămurire despre utilizarea comenzii
fillna() / ffill() / bfill()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.