Pandas & NumPy Academy · Oppitunti

Puuttuvien arvojen poistaminen

Poistakaa NaN-arvoja sisältävät rivit tai sarakkeet dropna()-menetelmällä ja määrittäkää käsiteltävien sarakkeiden vähimmäismäärä sekä osajoukko.

Oppitunti 2/413 vaihetta

Puuttuvien arvojen poistaminen on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.

Milloin puuttuvat arvot kannattaa poistaa?

Puuttuvia arvoja sisältävien rivien poistaminen on yksinkertaisin imputointistrategia, mutta se on pätevä vain, kun tiedot puuttuvat täysin satunnaisesti (MCAR) — toisin sanoen arvon puuttumisen todennäköisyys ei riipu itse puuttuvasta arvosta tai mistään muusta muuttujasta. Jos puuttuminen on systemaattista (esimerkiksi pienituloiset vastaajat jättävät palkkakentän tyhjäksi), rivien poistaminen aiheuttaa harhaa. Selvitä puuttumisen kaava aina ennen poistopäätöstä.

import pandas as pd
import numpy as np

# Example: randomly missing salary data (MCAR-like)
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol', 'Dave'],
    'salary': [50000, np.nan, 70000, np.nan]
})
print('Before drop:', df.shape)  # (4, 2)
print(df)

dropna() — Peruskäyttö

DataFrame.dropna() poistaa oletusarvoisesti kaikki rivit, joissa on vähintään yksi NaN-arvo. Se palauttaa uuden DataFramen; alkuperäinen säilyy muuttumattomana, ellet välitä parametria inplace=True. Pienissä ja keskisuurissa aineistoissa tämä oletustoiminta sopii usein nopeaksi datan puhdistamisen ensimmäiseksi vaiheeksi.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, np.nan, 3, np.nan],
    'b': [10, 20, np.nan, 40],
    'c': [100, 200, 300, 400]
})

cleaned = df.dropna()
print(cleaned)
#      a     b    c
# 0  1.0  10.0  100

print('Original shape:', df.shape)    # (4, 3)
print('Cleaned shape:', cleaned.shape) # (1, 3)

how='all' — Poista vain kokonaan NaN-arvoja sisältävät rivit

Parametrin how='all' välittäminen käskee dropna-metodia poistamaan rivin vain, jos jokainen sen arvo on NaN. Tämä on paljon varovaisempi tapa kuin oletusarvo how='any'. Käytä how='all'-asetusta, kun aineistossa on harvoja rivejä — jonkin verran tietoja sisältävät rivit kannattaa säilyttää, kun taas kokonaan tyhjät rivit ovat selvästi tarpeettomia tietueita.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, np.nan, np.nan],
    'b': [2, np.nan, np.nan],
    'c': [3, 4, np.nan]
})

# Row 2 has ALL NaN — dropped
# Row 1 has partial NaN — kept with how='all'
cleaned = df.dropna(how='all')
print(cleaned)
#      a    b    c
# 0  1.0  2.0  3.0
# 1  NaN  NaN  4.0

subset= — Tarkista vain tietyt sarakkeet

subset-parametri rajoittaa niiden sarakkeiden määrää, joista NaN-arvot tarkistetaan päätettäessä, poistetaanko rivi. Tämä on erittäin hyödyllistä, kun vain tietyt sarakkeet ovat kriittisiä — esimerkiksi rivi tulee poistaa, jos user_id- tai target-sarake puuttuu, mutta NaN-arvo valinnaisessa piirre-sarakkeessa voidaan hyväksyä.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'user_id': [1, np.nan, 3],
    'score': [88, 95, np.nan],
    'notes': ['ok', 'good', np.nan]
})

# Drop row only if user_id is missing — score and notes NaN are ok
cleaned = df.dropna(subset=['user_id'])
print(cleaned)
#    user_id  score notes
# 0      1.0   88.0    ok
# 2      3.0    NaN   NaN

thresh= — Ei-tyhjien arvojen vähimmäismäärä

thresh-parametri säilyttää rivin vain, jos siinä on vähintään thresh ei-NaN-arvoa. Tämä on hienojakoisempi vaihtoehto kuin how='any' tai how='all': voit esimerkiksi määrittää, että rivi säilytetään, jos vähintään kolmessa viidestä sarakkeesta on tietoja. Tämä on hyödyllistä aineistoissa, joissa jonkin verran puuttuvuutta odotetaan, mutta kokonaan tyhjät rivit halutaan poistaa.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, np.nan, np.nan],
    'b': [2, 3, np.nan],
    'c': [4, np.nan, np.nan],
    'd': [5, 6, np.nan]
})

# Keep rows with at least 3 non-null values
cleaned = df.dropna(thresh=3)
print(cleaned)
#      a    b    c    d
# 0  1.0  2.0  4.0  5.0
# 1  NaN  3.0  NaN  6.0

Sarakkeiden poistaminen rivien sijaan

Oletusarvoisesti dropna() poistaa rivejä (axis=0). Välitä parametriksi axis=1 (tai axis='columns'), jos haluat poistaa sen sijaan sarakkeet, joissa on yksikin NaN-arvo. Tämä sopii tilanteeseen, jossa sarake on enimmäkseen tyhjä ja sisältää vain vähän hyödyllistä tietoa — sen säilyttäminen lisäisi vain kohinaa malliin tai yhteenvetotaulukkoon.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['A', 'B', 'C'],
    'temp': [np.nan, np.nan, np.nan],  # completely empty column
    'score': [80, 90, 85]
})

# Drop columns that have any NaN
cleaned = df.dropna(axis=1)
print(cleaned)
#    id name  score
# 0   1    A     80
# 1   2    B     90
# 2   3    C     85

Sarakkeiden poistaminen puuttuvien arvojen raja-arvon perusteella

Tehokas toimintamalli on poistaa sarakkeet, joissa puuttuvien arvojen prosenttiosuus ylittää tietyn rajan. Laske puuttuvien arvojen osuus sarakkeittain, tunnista rajan (esimerkiksi 50 %) ylittävät sarakkeet ja poista ne komennolla df.drop(columns=cols_to_drop). Tämä on kohdennetumpi tapa kuin dropna(axis=1), joka poistaa jokaisen sarakkeen, jossa on yksikin NaN-arvo.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, 2, np.nan, 4, 5],
    'b': [np.nan, np.nan, np.nan, np.nan, 5],  # 80% missing
    'c': [1, np.nan, 3, 4, 5]                   # 20% missing
})

threshold = 0.5
high_missing = df.columns[df.isna().mean() > threshold]
print('Dropping:', high_missing.tolist())  # ['b']

cleaned = df.drop(columns=high_missing)
print(cleaned)

Indeksin säilyttäminen dropna()-metodin jälkeen

dropna()-metodin kutsumisen jälkeen alkuperäiset rivi-indeksit säilyvät — jos rivit 1 ja 3 poistettiin, jäljelle jäävän DataFramen indeksit ovat 0, 2 ja 4. Tämä on usein toivottavaa, koska alkuperäisiin kohtiin voi palata, mutta joskus haluat siistin juoksevan indeksin, joka alkaa arvosta 0. Numeroi rivit uudelleen kutsumalla poiston jälkeen .reset_index(drop=True)-metodia.

import pandas as pd
import numpy as np

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

cleaned = df.dropna()
print('With original index:')
print(cleaned)  # indices 0, 2, 4

cleaned_reset = cleaned.reset_index(drop=True)
print('With reset index:')
print(cleaned_reset)  # indices 0, 1, 2

dropna() työnkulussa

Koska dropna() palauttaa DataFramen, se sopii luontevasti osaksi metodikutsuketjua. dropna()-metodin ketjuttaminen lataus- ja analyysivaiheiden väliin on selkeä tapa pitää työnkulku luettavana ilman väliaikaisia muuttujia. Voit ketjuttaa sen myös metodien query(), assign() ja groupby() kanssa.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'region': ['East', 'West', None, 'East'],
    'revenue': [100, np.nan, 300, 400]
})

result = (
    df
    .dropna(subset=['region', 'revenue'])
    .groupby('region')['revenue'].sum()
)
print(result)
# region
# East    500.0
# dtype: float64

Milloin ei pidä poistaa: suosi täyttämistä

Rivien poistaminen hävittää dataa. Sarakkeissa, joissa puuttuvia arvoja on alle 5–10 %, täyttäminen (imputointi) on yleensä parempi vaihtoehto kuin poistaminen. Jos puuttuvat arvot korreloivat kohdemuuttujan kanssa (Missing Not At Random, MNAR), niiden poistaminen aiheuttaa lisäksi harhaa. Nyrkkisääntö: poista arvoja vain, kun puuttuminen on todella satunnaista, aineisto on riittävän suuri niin, etteivät menetetyt rivit merkitsevästi haittaa, eikä sarake tai rivi sisällä palautettavissa olevaa informaatiota.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'user': ['Alice', 'Bob', 'Carol', 'Dave'],
    'age': [25, np.nan, 30, np.nan]
})

missing_pct = df['age'].isna().mean()
print(f'Missing age: {missing_pct:.0%}')  # 50%
# 50% missing is high — consider imputing instead of dropping
# df['age'].fillna(df['age'].median(), inplace=True)

Käytännöllinen puhdistustyönkulku

Käytännöllinen puuttuvien arvojen käsittelytyönkulku yhdistää useita dropna-strategioita: poista ensin kokonaan tyhjät rivit, sitten sarakkeet, joista yli 60 % on tyhjiä, sen jälkeen rivit, joilta puuttuvat tärkeät tunniste- tai kohdesarakkeet, ja täytä lopuksi jäljelle jäävät yksittäiset NaN-arvot. Tämä kerroksittainen lähestymistapa säilyttää mahdollisimman paljon dataa.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3, np.nan],
    'feature': [1.0, np.nan, 3.0, 4.0],
    'useless': [np.nan, np.nan, np.nan, np.nan]
})

clean = (
    df
    .dropna(how='all')              # remove all-NaN rows
    .drop(columns=df.columns[df.isna().mean() > 0.9])  # remove >90% empty cols
    .dropna(subset=['id'])           # must have an ID
)
print(clean)
#      id  feature
# 0   1.0      1.0
# 1   2.0      NaN
# 2   3.0      3.0

Pikatarkistus

Testaa ymmärryksesi puuttuvien arvojen poistamisesta dropna()-menetelmällä.

Oppitunnin kertaus

Tässä oppitunnissa opit, että dropna() poistaa oletusarvoisesti NaN-arvoja sisältävät rivit, how='all' poistaa vain kokonaan tyhjät rivit, subset= rajoittaa tarkistuksen tiettyihin sarakkeisiin ja thresh= säilyttää rivit, joissa on vähintään tietty määrä ei-null-arvoja. Poista sarakkeita rivien sijaan käyttämällä axis=1. Seuraavaksi täytämme puuttuvia arvoja sen sijaan, että poistaisimme niitä, käyttämällä fillna()-menetelmää.

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 poistaminen” ilmainen?

Kyllä – oppitunnin ”Puuttuvien arvojen poistaminen” 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 poistaminen”?

Poistakaa NaN-arvoja sisältävät rivit tai sarakkeet dropna()-menetelmällä ja määrittäkää käsiteltävien sarakkeiden vähimmäismäärä sekä osajoukko. 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 2/4.

Kuinka kauan ”Puuttuvien arvojen poistaminen”-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