Chýbajúce hodnoty v Pandas spracujete kombináciou troch nástrojov: isna() na detekciu, dropna() na odstránenie a fillna() alebo interpolate() na doplnenie. V Pandas 2.2+ a pripravovanej verzii 3.0 sa odporúča používať nullable dátové typy s pd.NA, ktoré jednotne reprezentujú chýbajúce hodnoty v číselných, textových aj boolovských stĺpcoch. Tento sprievodca pokrýva všetky praktické scenáre, od základného počítania NaN až po KNN imputáciu pre produkčné ML pipeline.
V Pandas 2.2+ je pd.NA jednotný marker pre chýbajúce hodnoty naprieč dtype, kým np.nan je špeciálna float hodnota a None sa interne konvertuje na NaN v object stĺpcoch.
df.isna().sum() je najrýchlejší spôsob ako spočítať chýbajúce hodnoty v každom stĺpci; pre percentá vydeľte počtom riadkov.
dropna() je bezpečné len keď je podiel chýbajúcich hodnôt nízky (< 5 %) a chýbajú náhodne (MCAR); inak zavádza skreslenie.
fillna() podporuje skalár, dictionary podľa stĺpca a metódy ffill/bfill; pre časové rady je interpolate() presnejšie.
Pre produkčné ML pipeline použite SimpleImputer alebo KNNImputer zo scikit-learn 1.8, lebo zachovávajú stav imputácie pre tréning aj predikciu.
Od Pandas 3.0 bude predvolený PyArrow backend, ktorý urýchľuje fillna() a dropna() na veľkých DataFrame 3–10×.
NaN, None a pd.NA: aký je rozdiel
Pandas používa tri rôzne hodnoty na reprezentáciu „chýbajúcich" dát a každá má iné správanie. np.nan je IEEE 754 float, ktorý sa porovnaním sám so sebou vyhodnotí ako False, a preto výraz df['x'] == np.nan nikdy nevráti riadky. None je Pythonov singleton a v stĺpcoch typu object sa zobrazuje ako NaN po automatickej konverzii. Od Pandas 1.0 existuje pd.NA, ktorý je dtype-agnostický a šíri sa cez aritmetické aj porovnávacie operácie podľa pravidiel troch hodnôt (Kleene logic).
V mojej praxi som videl nespočetne veľa chýb spôsobených tým, že vývojár pridal stĺpec typu Int64 (nullable integer) a očakával, že fillna(0) bude pracovať identicky ako pri int64. Pri nullable typoch sa pd.NA šíri správne, ale zložené podmienky ako (df['a'] > 0) & (df['b'] < 10) môžu vrátiť pd.NA namiesto False, čo zlyhá pri použití v df.loc[]. Honestly, túto chybu som musel opravovať v produkcii dvakrát za posledný rok.
Najpoužívanejšie metódy na detekciu sú isna() a jej alias isnull(). Sú úplne identické a Pandas tím dokonca odporúča používať isna() pre konzistenciu so zvyškom API (dropna, fillna). Tieto funkcie vrátia DataFrame s rovnakými rozmermi, kde každá bunka obsahuje boolean. Skombinované s sum() alebo mean() rýchlo získate prehľad o rozsahu problému.
Pre rýchly audit dátového setu odporúčam tento jednoduchý snippet, ktorý vypíše počet aj percento chýbajúcich hodnôt zoradené zostupne:
Pre vizuálny prehľad sa hodí knižnica missingno, ktorá vykreslí maticu chýbajúcich hodnôt a koreláciu medzi nimi. Je to extrémne užitočné pri identifikácii štrukturálnych dôvodov (napríklad keď stĺpec A chýba vždy, keď chýba aj stĺpec B). V Jupyter notebooku stačí msno.matrix(df). Pri DataFrame nad milión riadkov použite najprv df.sample(100_000), inak je vykresľovanie pomalé.
Ak pracujete s veľkými datasetmi, pozrite si aj náš sprievodca DuckDB s Pandas pre SQL analytiku nad miliónmi riadkov. DuckDB dokáže audit chýbajúcich hodnôt vykonať priamo SQL dotazom COUNT(*) FILTER (WHERE col IS NULL) za zlomok času.
Kedy a ako použiť dropna() v Pandas
Tak, poďme k tej najjednoduchšej (a zároveň najnebezpečnejšej) stratégii. dropna() dokáže za sekundu zlikvidovať polovicu vášho datasetu, ak ju zavoláte bez parametrov. Použite ju len keď chýbajúce hodnoty tvoria menej ako 5 % datasetu a máte dôvod veriť, že chýbajú náhodne (MCAR). Metóda má štyri kľúčové parametre, ktoré určujú jej správanie.
# Odstráň riadky, ktoré majú ASPOŇ JEDNU chýbajúcu hodnotu (default)
df.dropna()
# Odstráň riadky, kde sú VŠETKY hodnoty chýbajúce
df.dropna(how='all')
# Ponechaj riadky, ktoré majú aspoň N nechýbajúcich hodnôt
df.dropna(thresh=3)
# Pozerá sa len na vybrané stĺpce (kritické pre business logic)
df.dropna(subset=['email', 'user_id'])
# Odstráň STĹPCE namiesto riadkov, ak chýba viac ako 50 % hodnôt
df.dropna(axis=1, thresh=int(0.5 * len(df)))
V produkčných pipeline takmer nikdy nevolám dropna() bez parametra subset. Dôvod je jednoduchý: ak má dataset 30 stĺpcov a jeden z nich (povedzme voliteľné middle_name) má 40 % chýbajúcich hodnôt, predvolený dropna() zlikviduje 40 % riadkov, hoci tento stĺpec ani nepoužívate na modelovanie. Vždy explicitne uveďte stĺpce, ktoré skutočne musia byť vyplnené.
fillna(): doplnenie konštantou, priemerom a podľa stĺpca
fillna() je najflexibilnejšia metóda. Dokáže nahradiť chýbajúce hodnoty skalárnou hodnotou, agregovanou hodnotou (priemer, medián, modus), inou Series alebo dictionary s rôznou hodnotou pre každý stĺpec. Voľba stratégie závisí od typu dát a od následného použitia.
# 1) Skalárna hodnota, vhodné pre kategórie alebo flagy
df['status'] = df['status'].fillna('neznamy')
# 2) Mediány pre numerické (odolné voči odľahlým hodnotám)
numericke = df.select_dtypes(include='number').columns
df[numericke] = df[numericke].fillna(df[numericke].median())
# 3) Modus pre kategorické
kategoricke = df.select_dtypes(include=['object', 'category']).columns
for col in kategoricke:
df[col] = df[col].fillna(df[col].mode().iloc[0])
# 4) Dictionary, odlišná stratégia pre každý stĺpec
df = df.fillna({
'vek': df['vek'].median(),
'mesto': 'Bratislava',
'prijem': 0,
})
# 5) Forward fill (zopakuj poslednú známu hodnotu)
df['cena'] = df['cena'].ffill()
# 6) Backward fill (použi nasledujúcu známu hodnotu)
df['cena'] = df['cena'].bfill()
Dôležitý detail: priame priradenie pomocou fillna() nad agregovanou hodnotou (povedzme priemerom) funguje len v rámci tréningovej sady. Pre testovacie dáta musíte použiť ten istý priemer vypočítaný na tréningových dátach, inak unikne informácia z testovacej sady do tréningu (data leakage). Túto chybu som zachytil pri shippingu klasifikátora rizík a naučil ma to navždy. Práve preto sa v ML pipeline odporúča SimpleImputer, o ktorom hovoríme nižšie. Viac o budovaní spoľahlivých pipeline nájdete v sprievodcovi Scikit-learn 1.8 ML pipeline v roku 2026.
Interpolácia chýbajúcich hodnôt v časových radoch
Pri časových radoch je fillna() s priemerom takmer vždy zlá voľba, pretože zničí trend aj sezónnosť. Lepšie je použiť interpolate(), ktorá doplní hodnoty na základe susedných pozorovaní. Pandas 2.2 podporuje viac ako 14 interpolačných metód, vrátane linear, time, spline, polynomial a akima.
idx = pd.date_range('2026-01-01', periods=10, freq='D')
ts = pd.Series([10, 12, np.nan, np.nan, 15, 18, np.nan, 22, 25, 28], index=idx)
# Lineárna interpolácia podľa indexu (rovnomerný krok)
ts.interpolate(method='linear')
# Časová interpolácia (zohľadňuje skutočný časový rozdiel medzi indexami)
ts.interpolate(method='time')
# Spline tretieho rádu, vhodné pre hladké signály (senzory, finančné dáta)
ts.interpolate(method='spline', order=3)
# Obmedziť interpoláciu na max 2 po sebe idúce NaN
ts.interpolate(method='linear', limit=2)
# Interpoluj len doprednu (nedopĺňať začiatok série)
ts.interpolate(method='linear', limit_direction='forward')
Podľa mojej skúsenosti je method='time' najlepšia voľba pre nepravidelne vzorkované rady (napríklad IoT senzory, ktoré niekedy vynechajú dátový bod). Pre finančné rady, kde sa cez víkend neobchoduje, používam method='linear' až po pretvarovaní cez asfreq('B'), aby som mal len pracovné dni. Detailný kontext nájdete v oficiálnej dokumentácii Pandas interpolate.
SimpleImputer a KNNImputer v scikit-learn pipeline
Akonáhle prejdete od prieskumnej analýzy k tréningu modelu, prestávajú stačiť priame Pandas operácie. Potrebujete stavový imputer, ktorý si zapamätá hodnoty z tréningovej sady (priemery, mediány, vzory) a aplikuje ich na nové dáta v produkcii. Tu prichádza SimpleImputer a KNNImputer zo scikit-learn 1.8.
KNNImputer ide ešte ďalej — pre každý riadok s chýbajúcou hodnotou nájde k najbližších susedov v priestore ostatných premenných a doplní vážený priemer. Funguje skvele, keď existuje silná korelácia medzi premennými, ale výpočtová náročnosť rastie kvadraticky s počtom riadkov. Pre dataset nad 100 000 riadkov radšej použite IterativeImputer, ktorý je založený na MICE (Multiple Imputation by Chained Equations).
Mimoriadne dôležitá vlastnosť HistGradientBoostingClassifier v scikit-learn 1.8 je natívna podpora NaN hodnôt. Vôbec nemusíte imputovať. Strom sa naučí pre každé rozdelenie, na ktorú stranu majú NaN hodnoty ísť. Tým ušetríte celý imputačný krok a často získate lepšiu presnosť. Pozrite si scikit-learn dokumentáciu o imputácii pre detaily.
Vzory chýbajúcich dát: MCAR, MAR a MNAR
Predtým než vyberiete stratégiu, mali by ste poznať vzor chýbajúcich dát. Štatistická literatúra rozlišuje tri kategórie a každá vyžaduje iný prístup:
Vzor
Definícia
Bezpečná stratégia
Príklad
MCAR
Missing Completely At Random, chýbanie nesúvisí s ničím
dropna() alebo priemer
Senzor občas vynechá meranie kvôli šumu
MAR
Missing At Random, chýbanie závisí od iných pozorovaných premenných
KNN / iterative imputácia
Starší respondenti neuvedú príjem
MNAR
Missing Not At Random, chýbanie závisí od samotnej chýbajúcej hodnoty
Modelovanie indikátora + doménová expertíza
Ľudia s vysokým príjmom ho neuvedú
Pre MNAR scenár je často najlepšie pridať indikátor chýbania ako novú premennú: df['prijem_chyba'] = df['prijem'].isna().astype(int). Model sa potom môže naučiť, že samotné chýbanie nesie informáciu. Tento trik som videl zlepšiť AUC modelu o 2 až 4 percentuálne body v scenároch s veľkým podielom MNAR dát.
Pandas 3.0 a PyArrow backend pre chýbajúce hodnoty
Pandas 3.0, ktorý je naplánovaný na vydanie v druhej polovici roka 2026, prináša najväčšiu zmenu v reprezentácii chýbajúcich hodnôt za posledných 10 rokov. Predvolený backend prechádza z NumPy na PyArrow, čo znamená, že pd.NA bude jednotná hodnota pre všetky dtype vrátane stringov, dátumov aj boolovských stĺpcov. Konkrétne výhody:
Konzistencia: Žiadne viac NaN v float, NaT v datetime a None v object. Všade pd.NA.
Rýchlosť:dropna() a fillna() sú 3 až 10× rýchlejšie vďaka kolumnárnemu Apache Arrow formátu.
Pamäť: String stĺpce zaberajú v priemere o 70 % menej pamäte oproti object dtype.
Interoperabilita: Nulová kópia výmena dát medzi Pandas, Polars, DuckDB a PyArrow.
Migráciu môžete otestovať už dnes nastavením pd.options.future.infer_string = True a dtype_backend='pyarrow' pri čítaní dát. Ak vás zaujíma porovnanie s alternatívami, prečítajte si Pandas 3.0 vs Polars 2026, kde detailne rozoberáme výkonnostné rozdiely. Oficiálnu cestovnú mapu nájdete v PDEP-10 návrhu pre povinnú PyArrow závislosť.
Často kladené otázky
Aký je rozdiel medzi isna() a isnull() v Pandas?
Žiadny, sú to úplné aliasy. Pandas tím odporúča používať isna() pre konzistenciu s dropna a fillna. Obe vrátia DataFrame s boolean hodnotami označujúcimi chýbajúce bunky.
Mám radšej odstrániť alebo doplniť chýbajúce hodnoty?
Závisí od podielu a vzoru chýbania. Pri MCAR a podiele pod 5 % je dropna() bezpečné. Pri vyššom podiele alebo MAR/MNAR vzore použite imputáciu (medián, KNN, iterative) a zvážte pridanie indikátora chýbania ako samostatnej premennej.
Prečo môj filter df[df['x'] == np.nan] nevracia žiadne riadky?
Pretože NaN sa podľa IEEE 754 nikdy nerovná sám sebe. Použite df[df['x'].isna()] alebo df[df['x'].isnull()], ktoré správne detekujú chýbajúce hodnoty.
Ako spočítam percento chýbajúcich hodnôt v každom stĺpci?
Použite (df.isna().mean() * 100).round(2). Metóda mean() nad boolean hodnotami vracia podiel True hodnôt, vynásobením 100 dostanete percento.
Funguje fillna() s nullable Int64 dátovým typom?
Áno, ale musíte doplniť celočíselnú hodnotu, nie float. df['col'].fillna(0) funguje, kým fillna(0.0) vyhodí TypeError. V Pandas 3.0 s PyArrow backendom bude správanie konzistentnejšie.
Praktický sprievodca štatistickým testovaním hypotéz v SciPy 1.15. T-testy, ANOVA, Wilcoxon, chi-square, veľkosť efektu, korekcia pre viacnásobné porovnania a moderné bootstrap a permutačné metódy.
DuckDB 1.5 mení pravidlá hry pre Python analytiku v roku 2026. Pozrite sa, ako ho prepojiť s Pandas, čítať Parquet bez načítania do pamäte a postaviť ETL pipeline 50× rýchlejšiu ako čistý Pandas — bez servera, bez Sparku.
Praktický sprievodca vizualizáciou dát v Pythone s Matplotlib 3.10 a Seaborn 0.13. Základné aj pokročilé grafy, subplot_mosaic, Objects rozhranie, integrácia s Pandas 3.0 a vizualizácia ML výsledkov.