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:

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()

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:

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