12. diel - Pandas - Spracovanie chýbajúcich hodnôt Nové

V predchádzajúcej lekcii, Pandas - Kombinovanie DataFrame, sme si ukázali metódy na kombinovanie DataFramov.

V tomto tutoriále 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:

Import dát - Pandas - Vizualizácia dát v Pythone

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:

Zobrazenie chýbajúcich hodnôt - Pandas - Vizualizácia dát v Pythone

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:

Zobrazenie chýbajúcich hodnôt v stĺpci - Pandas - Vizualizácia dát v Pythone

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:

Zobrazenie validných hodnôt - Pandas - Vizualizácia dát v Pythone

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é:

Odstránenie chýbajúcich hodnôt - Pandas - Vizualizácia dát v Pythone

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:

Odstránenie chýbajúcich hodnôt v stĺpci - Pandas - Vizualizácia dát v Pythone

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:

Vyplnenie chýbajúcich hodnôt - Pandas - Vizualizácia dát v Pythone
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':

Vyplnenie chýbajúcich hodnôt priemerom - Pandas - Vizualizácia dát v Pythone

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:

Vyplnenie chýbajúcich hodnôt zvrchu - Pandas - Vizualizácia dát v Pythone

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:

Vyplnenie chýbajúcich hodnôt zospodu - Pandas - Vizualizácia dát v Pythone

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()
Vyplnenie chýbajúcich hodnôt zospodu s limitom - Pandas - Vizualizácia dát v Pythone

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

Využitie metódy interpolate - Pandas - Vizualizácia dát v Pythone

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é 2x (58.73 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Ako sa ti páči článok?
Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
Predchádzajúci článok
Pandas - Kombinovanie DataFrame
Všetky články v sekcii
Pandas - Vizualizácia dát v Pythone
Preskočiť článok
(neodporúčame)
Kvíz - Práca s reťazcami, matematickými dátami v Pandas
Článok pre vás napísal Adam Hamšík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
.
Aktivity