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.
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.0Tä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.0Kategoristen 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.0Taaksepä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: float64Eteen- 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.0Eri 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 UKRyhmä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.0Tä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 7fillna()-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 DNaN-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: int64Pikatarkistus
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.
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
- Puuttuvien arvojen tunnistaminen
- Puuttuvien arvojen poistaminen
- Puuttuvien arvojen täyttäminen
- Interpolointi ja edistynyt imputointi