Mengisi Nilai Hilang
Gantikan NaN dengan pemalar, min lajur, pengisian ke hadapan atau pengisian ke belakang menggunakan fillna() dan parameter kaedahnya.
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.0Mengisi 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.0Mengisi 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.0Pengisian 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: float64Parameter 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.0Mengisi 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 UKImputasi 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.0Mengisi 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 7Merangkaikan 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 DMengesahkan 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: int64Semakan 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.
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
- Mengesan Nilai Hilang
- Menggugurkan Nilai Hilang
- Mengisi Nilai Hilang
- Interpolasi dan Imputasi Lanjutan