fillna() / ffill() / bfill() în pandas

Completează valorile lipsă cu o valoare fixă, cu valori diferite pe coloane, cu media sau cu valoarea anterioară ori următoare.

Sintaxă
df.fillna(value, *, axis=None, limit=None)
df.ffill(*, axis=None, limit=None, limit_area=None)
df.bfill(*, axis=None, limit=None, limit_area=None)

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 parametrul method nu mai există și primești TypeError; folosește df.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 în df, 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ă str afiș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.
Comunitate & Schimb de cunoștințe

Î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.

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.