Pandas & NumPy Academy · Oppitunti

Puuttuvien arvojen täyttäminen

Korvatkaa NaN vakioarvolla, sarakkeen keskiarvolla, eteenpäin täyttämällä tai taaksepäin täyttämällä käyttämällä fillna()-menetelmää ja sen method-parametria.

Oppitunti 3/413 vaihetta

Puuttuvien arvojen täyttäminen on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

fillna()-menetelmän esittely

Imputointi tarkoittaa puuttuvien arvojen korvaamista järkevällä korvikkeella rivin poistamisen sijaan. Pandasin fillna() on tähän ensisijainen työkalu: se korvaa kaikki Series- tai DataFrame-rakenteen NaN-arvot määrittämälläsi arvolla. Toisin kuin poistaminen, imputointi säilyttää kaikki rivit, mikä on erityisen tärkeää, kun dataa on niukasti tai puuttuvien arvojen kuvio sisältää informaatiota.

Yksinkertaisimmillaan menetelmälle välitetään skalaarinen arvo: df['col'].fillna(0).

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'price': [10.0, np.nan, 30.0, np.nan]
})

# Fill all NaN in 'price' with 0
filled = df['price'].fillna(0)
print(filled)
# 0    10.0
# 1     0.0
# 2    30.0
# 3     0.0

Täyttäminen sarakkeen keskiarvolla tai mediaanilla

Sarakkeen keskiarvolla (symmetrisille jakaumille) tai mediaanilla (vinoille jakaumille) täyttäminen on yksi yleisimmistä imputointistrategioista. Nämä tilastot kuvaavat datan keskittymistä, joten ne vääristävät sarakkeen jakaumaa mahdollisimman vähän. Laske tilasto aina opetusjoukon osasta, jotta vältät datavuodon.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'salary': [50000, np.nan, 70000, 80000, np.nan, 60000]
})

mean_salary = df['salary'].mean()
median_salary = df['salary'].median()

df['salary_mean_filled'] = df['salary'].fillna(mean_salary)
df['salary_median_filled'] = df['salary'].fillna(median_salary)
print(df)
#     salary  salary_mean_filled  salary_median_filled
# 0  50000.0             50000.0               50000.0
# 1      NaN             65000.0               65000.0
# 2  70000.0             70000.0               70000.0

Kategoristen arvojen täyttäminen moodilla

Kategorisissa sarakkeissa keskiarvolla tai mediaanilla täyttäminen ei ole järkevää. Käytä sen sijaan moodia eli useimmin esiintyvää arvoa. Series.mode()[0] palauttaa yleisimmän arvon ([0] käsittelee tilanteen, jossa moodeja on useita).

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'status': ['active', 'inactive', None, 'active', None, 'active']
})

most_common = df['status'].mode()[0]
print('Mode:', most_common)  # active

df['status'] = df['status'].fillna(most_common)
print(df['status'].tolist())
# ['active', 'inactive', 'active', 'active', 'active', 'active']

Eteenpäin täyttäminen ffill()-menetelmällä

Eteenpäin täyttäminen (forward fill, last-observation-carried-forward eli LOCF) siirtää viimeisimmän kelvollisen (ei-NaN-)arvon eteenpäin täyttämään seuraavat NaN-kohdat. Se sopii ihanteellisesti aikasarjadatalla, jossa mittaus pysyy vakiona päivitykseen asti – esimerkiksi laitteen tilassa, hintatasoissa tai anturimittauksissa, jotka muuttuvat vain tiettyjen tapahtumien yhteydessä.

import pandas as pd
import numpy as np

price = pd.Series(
    [100, np.nan, np.nan, 105, np.nan, 110],
    index=pd.date_range('2024-01', periods=6, freq='ME')
)

filled = price.ffill()
print(filled)
# 2024-01-31    100.0
# 2024-02-29    100.0
# 2024-03-31    100.0
# 2024-04-30    105.0
# 2024-05-31    105.0
# 2024-06-30    110.0

Taaksepäin täyttäminen bfill()-menetelmällä

Taaksepäin täyttäminen (backward fill, next-observation-carried-backward eli NOCB) siirtää seuraavan kelvollisen arvon taaksepäin täyttämään sitä edeltävät NaN-kohdat. Tämä on hyödyllistä, kun tiedät tulevan datan täydentävän puuttuvia aiempia arvoja – esimerkiksi kun saat kuukauden lopun tiedot ja sinun on täydennettävä kyseisen kuukauden raporttia edeltävät päivät.

import pandas as pd
import numpy as np

df = pd.DataFrame({'value': [np.nan, np.nan, 3, np.nan, 5]})

print(df['value'].bfill())
# 0    3.0
# 1    3.0
# 2    3.0
# 3    5.0
# 4    5.0
# dtype: float64

Eteen- ja taaksepäin täyttämisen limit-parametri

Sekä ffill()- että bfill()-menetelmälle voi välittää limit-parametrin, joka rajoittaa täytettävien peräkkäisten NaN-arvojen määrää. Tämä on tärkeää, kun haluat siirtää arvoa eteenpäin vain lyhyen aukon yli – pitkien aukkojen tulee säilyä NaN-arvoina merkkinä siitä, että data puuttuu aidosti eikä ole vain viivästynyt.

import pandas as pd
import numpy as np

s = pd.Series([1.0, np.nan, np.nan, np.nan, 5.0])

# Fill only the first NaN gap, leave the rest
print(s.ffill(limit=1))
# 0    1.0
# 1    1.0   <- filled
# 2    NaN   <- still NaN (limit reached)
# 3    NaN
# 4    5.0

Eri sarakkeiden erilainen täyttäminen

Oikeassa DataFrame-rakenteessa eri sarakkeet saattavat tarvita erilaiset täyttöstrategiat. Välitä fillna()-menetelmälle sanakirja, jonka avaimia ovat sarakkeiden nimet ja arvoja täytettävät arvot. Näin sarakekohtainen imputointi voidaan tehdä yhdellä kutsulla, mikä on selkeämpää kuin useiden yksittäisten fillna-kutsujen ketjuttaminen.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'age': [25, np.nan, 30],
    'income': [50000, np.nan, 70000],
    'country': ['USA', np.nan, 'UK']
})

fill_values = {
    'age': df['age'].median(),
    'income': df['income'].mean(),
    'country': 'Unknown'
}

filled = df.fillna(fill_values)
print(filled)
#     age   income  country
# 0  25.0  50000.0      USA
# 1  27.5  60000.0  Unknown
# 2  30.0  70000.0       UK

Ryhmät huomioiva imputointi

Edistyneempi strategia on täyttää NaN-arvot ryhmän keskiarvolla tai mediaanilla koko sarakkeen keskiarvon sijaan. Voit esimerkiksi täyttää puuttuvan palkan kyseisen ammattiryhmän mediaanipalkalla. Tämä säilyttää alaryhmien rakenteen ja tuottaa realistisempia imputointeja kuin koko aineistoon perustuva tilasto.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'dept': ['Eng', 'Eng', 'HR', 'HR', 'Eng'],
    'salary': [90000, np.nan, 50000, np.nan, 110000]
})

# Fill salary NaN with the median salary for each department
df['salary'] = df.groupby('dept')['salary'].transform(
    lambda x: x.fillna(x.median())
)
print(df)
#    dept   salary
# 0   Eng  90000.0
# 1   Eng  100000.0   <- group median (90k+110k)/2
# 2    HR  50000.0
# 3    HR  50000.0
# 4   Eng  110000.0

Täyttäminen vakiomuotoisella merkkivaluarvolla

Joskus oikea imputointiarvo on merkkivaloarvo, joka ilmaisee arvon olevan ”tuntematon” eikä todellinen mittaus. Esimerkiksi -1 tuntemattomalle iälle, 'N/A' tuntemattomalle kategorialle tai False tuntemattomalle totuusarvolipulle. Merkkivaloarvot ovat käyttökelpoisia, kun myöhempi koodi tarkistaa ne nimenomaisesti ja käsittelee niitä eri tavalla kuin todellista dataa.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'user_id': [1, 2, 3],
    'referral_source': ['email', np.nan, 'ad'],
    'trial_days': [14, np.nan, 7]
})

df['referral_source'] = df['referral_source'].fillna('unknown')
df['trial_days'] = df['trial_days'].fillna(-1).astype(int)
print(df)
#    user_id referral_source  trial_days
# 0        1           email          14
# 1        2         unknown          -1
# 2        3              ad           7

fillna()-menetelmien ketjuttaminen putkessa

Kuten kaikki Pandasin menetelmät, fillna() palauttaa uuden DataFrame-rakenteen ja sopii siististi osaksi menetelmäketjua. .dropna()-kutsun jälkeen käytettävä .fillna() toteuttaa kaksivaiheisen strategian: poista rivit, joilta puuttuvat kriittiset sarakkeet, ja täytä sitten jäljelle jäävät valinnaiset NaN-arvot järkevillä oletusarvoilla – kaikki yhdessä helposti luettavassa putkessa.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'user_id': [1, None, 3, 4],
    'score': [88, 95, np.nan, 76],
    'label': ['A', 'B', None, 'D']
})

cleaned = (
    df
    .dropna(subset=['user_id'])
    .fillna({'score': df['score'].mean(), 'label': 'Unknown'})
)
print(cleaned)
#    user_id  score    label
# 0      1.0   88.0        A
# 2      3.0   86.3  Unknown
# 3      4.0   76.0        D

NaN-arvojen puuttumisen varmistaminen

Varmista imputoinnin jälkeen aina, ettei kohteena olleissa sarakkeissa ole jäljellä yhtään NaN-arvoa. Kutsu df.isna().sum()-menetelmää tai varmista väitteen avulla, että määrä on nolla. Odottamaton nollaa suurempi määrä tarkoittaa, että fillna-kutsusi ei käsitellyt jotakin tapausta – ehkä sarakkeen dtype esti täyttämisen tai unohdit sarakkeen sanakirjasta.

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1.0, np.nan, 3.0], 'b': [np.nan, 2.0, 3.0]})
filled = df.fillna(0)

# Verify
assert filled.isna().sum().sum() == 0, 'Some NaN remain!'
print('All NaN filled successfully')
print(filled.isna().sum())
# a    0
# b    0
# dtype: int64

Pikatarkistus

Testaa ymmärryksesi puuttuvien arvojen täyttämisestä Pandasissa.

Oppitunnin kertaus

Tässä oppitunnissa opit, että fillna(scalar) korvaa kaikki NaN-arvot vakiolla, fillna(mean/median) tekee imputoinnin sarakkeen tilastojen avulla ja ffill()/bfill() siirtävät viereisiä arvoja aikasarjoissa. Välitä sanakirja fillna()-menetelmälle sarakekohtaisia strategioita varten ja käytä groupby().transform()-menetelmää ryhmät huomioivaan imputointiin. Seuraavaksi käsittelemme interpolointia ja sitä, milloin kannattaa käyttää edistyneitä imputointitekniikoita.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Puuttuvien arvojen täyttäminen” ilmainen?

Kyllä – oppitunnin ”Puuttuvien arvojen täyttäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Puuttuvien arvojen täyttäminen”?

Korvatkaa NaN vakioarvolla, sarakkeen keskiarvolla, eteenpäin täyttämällä tai taaksepäin täyttämällä käyttämällä fillna()-menetelmää ja sen method-parametria. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Puuttuvien arvojen täyttäminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Puuttuvien arvojen tunnistaminen
  2. Puuttuvien arvojen poistaminen
  3. Puuttuvien arvojen täyttäminen
  4. Interpolointi ja edistynyt imputointi
← Takaisin: Pandas & NumPy Academy