Pandas & NumPy Academy · Pelajaran

Mengisi Nilai Hilang

Gantikan NaN dengan pemalar, min lajur, pengisian ke hadapan atau pengisian ke belakang menggunakan fillna() dan parameter kaedahnya.

Pelajaran 3 daripada 413 langkah

Mengisi Nilai Hilang ialah pelajaran Pandas & NumPy Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pandas & NumPy Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.

Pengenalan kepada fillna()

Imputasi bermaksud menggantikan nilai yang hilang dengan pengganti yang munasabah dan bukannya membuang baris tersebut. Pandas fillna() ialah alat utama untuk tujuan ini: ia menggantikan setiap NaN dalam Series atau DataFrame dengan nilai yang Anda tentukan. Berbanding membuang data, imputasi mengekalkan semua baris, yang amat penting apabila data terhad atau apabila corak kehilangan data memberikan maklumat.

Bentuk paling mudah menerima skalar: 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

Mengisi dengan Min atau Median Lajur

Mengisi dengan mean lajur (untuk taburan simetri) atau median (untuk taburan senget) ialah antara strategi imputasi yang paling biasa. Statistik ini mewakili kecenderungan memusat data, jadi ia meminimumkan perubahan pada taburan lajur. Sentiasa kira statistik tersebut pada pecahan latihan untuk mengelakkan kebocoran data.

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

Mengisi Data Kategori dengan Mod

Untuk lajur kategori, mengisi dengan min atau median tidak munasabah. Sebaliknya, gunakan mode — nilai yang paling kerap muncul. Series.mode()[0] mengembalikan nilai yang paling biasa (bahagian [0] mengendalikan keadaan apabila terdapat lebih daripada satu mod).

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']

Pengisian Ke Hadapan dengan ffill()

Pengisian ke hadapan (juga dikenali sebagai last-observation-carried-forward, LOCF) menyebarkan nilai terakhir yang sah (bukan NaN) ke hadapan untuk mengisi kedudukan NaN yang berikutnya. Kaedah ini amat sesuai untuk data siri masa apabila sesuatu ukuran kekal malar sehingga dikemas kini — contohnya status peranti, aras harga atau bacaan penderia yang hanya berubah pada peristiwa tertentu.

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

Pengisian Ke Belakang dengan bfill()

Pengisian ke belakang (next-observation-carried-backward, NOCB) menyebarkan nilai sah yang seterusnya ke belakang untuk mengisi kedudukan NaN sebelumnya. Kaedah ini berguna apabila Anda tahu data masa hadapan akan mengisi nilai masa lalu yang hilang — contohnya, apabila Anda menerima data hujung bulan dan perlu mengisi semula hari-hari dalam bulan tersebut sebelum laporan diterima.

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

Parameter limit untuk Pengisian ke Hadapan dan ke Belakang

Kedua-dua ffill() dan bfill() menerima parameter limit yang mengehadkan bilangan nilai NaN berturutan yang diisi. Ini penting apabila Anda hanya mahu membawa sesuatu nilai merentasi jurang yang pendek — jurang yang panjang hendaklah kekal sebagai NaN untuk menunjukkan bahawa data itu benar-benar hilang, bukan sekadar tertangguh.

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

Mengisi Lajur yang Berbeza dengan Cara Berbeza

Dalam DataFrame sebenar, lajur yang berbeza mungkin memerlukan strategi pengisian yang berbeza. Hantarkan kamus kepada fillna(), dengan kunci sebagai nama lajur dan nilai sebagai nilai pengisian. Kaedah ini melaksanakan imputasi khusus lajur dalam satu panggilan, yang lebih kemas berbanding merangkaikan beberapa panggilan fillna secara berasingan.

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

Imputasi Berdasarkan Kumpulan

Strategi yang lebih canggih ialah mengisi nilai NaN dengan min atau median kumpulan, bukannya min keseluruhan lajur. Contohnya, isi gaji yang hilang dengan median gaji bagi kategori pekerjaan tersebut. Kaedah ini mengekalkan struktur subkumpulan dan menghasilkan imputasi yang lebih realistik berbanding statistik global.

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

Mengisi dengan Nilai Pemegang Tempat Tetap

Kadangkala imputasi yang betul ialah nilai pemegang tempat yang menandakan “tidak diketahui”, bukannya ukuran sebenar. Contohnya, -1 untuk umur yang tidak diketahui, 'N/A' untuk kategori yang tidak diketahui atau False untuk bendera boolean yang tidak diketahui. Nilai pemegang tempat sesuai digunakan apabila kod seterusnya memeriksanya secara jelas dan mengendalikannya secara berbeza daripada data sebenar.

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

Merangkaikan fillna() dalam Saluran Paip

Seperti semua kaedah Pandas, fillna() mengembalikan DataFrame baharu dan boleh disepadukan dengan kemas ke dalam rantaian kaedah. Memanggil .fillna() selepas .dropna() melaksanakan strategi dua langkah: buang baris yang tiada lajur penting, kemudian isi baki nilai NaN pilihan dengan nilai lalai yang munasabah — semuanya dalam satu saluran paip yang mudah dibaca.

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

Mengesahkan Tiada NaN yang Tertinggal

Selepas imputasi, sentiasa sahkan bahawa tiada nilai NaN yang tertinggal dalam lajur yang Anda sasarkan. Panggil df.isna().sum() atau tegaskan bahawa bilangannya ialah sifar. Bilangan bukan sifar yang tidak dijangka bermakna fillna Anda terlepas sesuatu kes — mungkin lajur mempunyai dtype yang menghalang pengisian, atau Anda terlupa memasukkan lajur dalam kamus.

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

Semakan Pantas

Uji pemahaman Anda tentang mengisi nilai yang hilang dalam Pandas.

Ulang Kaji Pelajaran

Dalam pelajaran ini, Anda telah mempelajari bahawa fillna(scalar) menggantikan semua NaN dengan pemalar, fillna(mean/median) melakukan imputasi menggunakan statistik lajur, dan ffill()/bfill() menyebarkan nilai bersebelahan untuk siri masa. Hantarkan kamus kepada fillna() untuk strategi khusus lajur, dan gunakan groupby().transform() untuk imputasi berdasarkan kumpulan. Seterusnya, kita akan membincangkan interpolasi dan masa untuk memilih teknik imputasi lanjutan.

Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Mengisi Nilai Hilang” percuma?

Ya — teks penuh “Mengisi Nilai Hilang” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pandas & NumPy Academy, tingkat taraf kepada CoddyKit PRO. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengisi Nilai Hilang”?

Gantikan NaN dengan pemalar, min lajur, pengisian ke hadapan atau pengisian ke belakang menggunakan fillna() dan parameter kaedahnya. Anda berlatih Pandas & NumPy Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pandas & NumPy Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pandas & NumPy Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Mengisi Nilai Hilang” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengesan Nilai Hilang
  2. Menggugurkan Nilai Hilang
  3. Mengisi Nilai Hilang
  4. Interpolasi dan Imputasi Lanjutan
← Kembali ke Pandas & NumPy Academy