12. diel - Pandas - Spracovanie chýbajúcich hodnôt
V predchádzajúcej lekcii, Pandas - Kombinovanie DataFrames, sme si ukázali metódy na kombinovanie DataFramov.
V tejto lekcii knižnice Pandas v Pythone sa zameriame na metódy, ktoré nám pomáhajú pracovať s chýbajúcimi hodnotami v dátach.
Spracovanie neúplných dát v Pandas
Než si predstavíme dnešnú tému, poďme si najskôr importovať testovacie dáta.
Import dát
Budeme pracovať s ukážkovým datasetom zdravotníckeho sektora v USA, ktorý obsahuje informácie o zamestnancoch, ich príjmoch a ďalších detailoch. Dataset je k dispozícii na stiahnutie na konci lekcie.
Dataset je možné načítať pomocou nasledujúceho kódu, do ktorého
navyše pridáme niekoľko chýbajúcich hodnôt metódou concat(),
ktorú sme si predstavili v lekcii Pandas - Kombinovanie
DataFrame:
import pandas as pd df = pd.read_csv('healthcare.csv') data = { 'EmployeeID': [1414931, 1200301, 1060317, 1812425, 1313912], 'Age': [35, None, 45, None, 40], 'MonthlyIncome': [5000, 6000, None, 7500, 6200], 'Department': ['Cardiology', 'Neurology', 'Cardiology', 'Neurology', 'Radiology'] } df_new = pd.DataFrame(data) df = pd.concat([df, df_new], ignore_index=True) df
Dostaneme nasledujúci výstup:

Teraz sa už môžeme vrhnúť na sľubované metódy.
Metódy
V reálnej analýze dát sa často stretávame s neúplnými informáciami, a
preto je dôležité rozumieť nástrojom, ktoré Pandas ponúka. Ukážeme si
metódy ako dropna(), isnull(),
notnull(), fillna() a ich variácie, vrátane
ďalších užitočných postupov ako bfill() alebo
interpolate().
isnull()
Metóda isnull() identifikuje chýbajúce
hodnoty (NaN) v dataframe. Metóda vracia nový dataframe,
kde sú chýbajúce hodnoty označené ako True a ostatné hodnoty
ako False.
My ju môžeme použiť takto:
df.isnull().tail(6)
Zároveň sme použili metódu tail(), aby sme dostali iba
posledných šesť záznamov, pretože sme si pridali na koniec dataframu päť
nových.
Keď teraz porovnáme posledných päť záznamov s tým úplne hore (index
1675), uvidíme, že sa v nových záznamoch vyskytujú často
hodnoty True vyjadrujúce chýbajúce hodnoty:

Ak chceme iba zistiť, či dataset obsahuje chýbajúce hodnoty, použijeme
metódu isnull().any():
df.isnull().any()
Výstupom budú všetky stĺpce. U stĺpcov, kde existujú akékoľvek
prázdne hodnoty, uvidíme True:

notnull()
Metóda notnull() robí pravý opak metódy
isnull(). Vráti dataframe s hodnotami True pre
všetky nenulové (validné) hodnoty
False tam, kde je NaN:
df.notnull().tail(6)
Vo výstupe je tak možné ľahko overiť, ktoré bunky neobsahujú chýbajúcu hodnotu:

dropna()
Metóda dropna() odstraňuje riadky alebo
stĺpce obsahujúce chýbajúce hodnoty.
Štandardne odstráni celé riadky, ak v ktoromkoľvek stĺpci chýba
hodnota.
Odstránenie riadkov obsahujúcich NaN vyzerá takto:
df_cleaned = df.dropna() df_cleaned
Vidíme, že všetky riadky s hodnotami NaN boli
odstránené:

Pôvodne sme mali o päť záznamov viac. Boli to práve tie záznamy, ktoré sme si pridali navyše pri importe.
Odstránenie riadkov na základe špecifického stĺpca
Na odstránenie riadkov s hodnotou NaN v konkrétnom stĺpci,
napríklad v stĺpci MonthlyIncome, použijeme parameter
subset:
df_cleaned = df.dropna(subset=['MonthlyIncome'])
df_cleaned
Vidíme, že boli odstránené iba riadky, kde bol NaN v stĺpci
MonthlyIncome:

Vidíme, že počet záznamov je teraz 1680. Pôvodne bol
1681.
fillna()
Metóda fillna() nahrádza chýbajúce hodnoty zadanou
hodnotou alebo metódou. Toto je užitočné, ak
chceme nahradiť NaN zmysluplnou hodnotou namiesto ich
odstránenia.
Kód nahradenia NaN pevnou hodnotou vyzerá takto:
df_filled = df.fillna(0)
df_filled
Všetky NaN hodnoty boli nahradené hodnotou 0:

Nahradenie NaN
priemernou hodnotou
Pre numerické stĺpce môžeme použiť štatistické hodnoty, napríklad priemerné hodinové mzdy:
average_hours = df['HourlyRate'].mean() df['HourlyRate'] = df['HourlyRate'].fillna(average_hours) df[['EmployeeID','Age','HourlyRate']]
Hodnota 65.470167 vo výstupe nižšie zodpovedá priemeru
stĺpca HourlyRate:

ffill() a bfill()
Metódy ffill (forward fill) a bfill (backward
fill) nahrádzajú chýbajúce hodnoty podľa susedných
hodnôt:
df_ffilled = df.ffill() df_filled[['EmployeeID','Age','DistanceFromHome']]
Metóda ffill nahradí NaN hodnotami z
predchádzajúcich riadkov. Znamená to teda, že napríklad v stĺpci
DistanceFromHome uvidíme všade hodnoty 2.0, pretože
vrchný riadok (s najmenším indexom) mal práve hodnotu 2.0:

Ak by sme to chceli urobiť obrátene, využili by sme metódu
bfill(). V našom prípade to však zatiaľ fungovať nebude,
pretože posledné záznamy majú hodnotu NaN.
Nastavme teda poslednému záznamu nejakú hodnotu pre
DistanceFromHome a potom vyskúšajme metódu
bfill():
df.loc[df.index[-1], 'DistanceFromHome'] = 10 df_bfilled = df.bfill() df_bfilled[['EmployeeID','Age','DistanceFromHome']]
Po nastavení hodnoty pre posledný záznam v stĺpci
DistanceFromHome sa táto hodnota použije pri použití
bfill() a všetky NaN záznamy sa tak vyplnia:

Pri použití metód ffill() a bfill() môžeme
tiež nastaviť limit vyplňovania pomocou parametra
limit:
df_bfilled = df.bfill(limit=2) df_bfilled[['EmployeeID','Age','DistanceFromHome']].tail()
Výstup:

Vidíme, že zvyšné dva záznamy zostali s hodnotou NaN.
interpolate()
Poslednou metódou, ktorú si dnes ukážeme, je metóda
interpolate() pre numerické údaje. Metóda vie
dopočítať chýbajúce hodnoty na základe okolitých validných (nenulových)
hodnôt. Táto metóda sa využíva predovšetkým v prípadoch, keď dáta
majú plynulý (kontinuálny) charakter, napríklad časové rady.
Ukážme si dopočítanie chýbajúcej hodnoty v stĺpci
Age:
df['Age'] = df['Age'].interpolate() df[['EmployeeID','Age']].tail()
Tu sa automaticky použije lineárna interpolácia, ktorá
"vytvorí" medziľahlé hodnoty medzi dvoma známymi číslami. Po zobrazení
dataframu uvidíme, že sa v stĺpci Age doplnili chýbajúce
záznamy (na indexoch 1677 a 1679) podľa okolitých
riadkov:

Ak sú záznamy v dataframe náhodne zoradené alebo medzi riadkami neexistuje logická nadväznosť (ako napríklad v časovom rade), môže interpolácia priniesť zavádzajúce výsledky. Lineárna interpolácia vlastne "predpokladá", že stĺpec s dátami sa plynule mení v rámci indexu riadkov, čo pri tabuľkách s náhodným poradím zamestnancov, miest a podobne nemusí platiť. Ak je navyše v dátach viacero chýbajúcich hodnôt idúcich po sebe, interpolácia medzi dvoma vzdialenými bodmi často nedáva zmysel.
V nasledujúcom kvíze, Kvíz - Práca s reťazcami, matematickými dátami v Pandas, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 4x (59.22 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

