Pandas & NumPy Academy · Pelajaran

Mengisi Nilai yang Hilang

Ganti NaN dengan konstanta, rata-rata kolom, pengisian ke depan, atau pengisian ke belakang menggunakan fillna() dan parameter method-nya.

Pelajaran 3 dari 413 langkah

Mengisi Nilai yang Hilang adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Pengantar fillna()

Imputasi berarti mengganti nilai yang hilang dengan pengganti yang wajar, bukan menghapus barisnya. Pandas fillna() adalah alat utama untuk ini: alat tersebut mengganti setiap NaN dalam Series atau DataFrame dengan nilai yang Anda tentukan. Berbeda dari penghapusan, imputasi mempertahankan semua baris, yang sangat penting terutama ketika data terbatas atau pola nilai yang hilang mengandung informasi.

Bentuk paling sederhananya menggunakan 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 Mean atau Median Kolom

Mengisi dengan mean kolom (untuk distribusi simetris) atau median (untuk distribusi miring) merupakan salah satu strategi imputasi yang paling umum. Statistik ini mewakili kecenderungan pusat data, sehingga meminimalkan perubahan pada distribusi kolom. Selalu hitung statistik tersebut pada pemisahan data latih untuk mencegah 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 Kategorikal dengan Mode

Untuk kolom kategorikal, mengisi dengan mean atau median tidaklah bermakna. Sebagai gantinya, gunakan mode — nilai yang paling sering muncul. Series.mode()[0] mengembalikan nilai yang paling umum ([0] menangani kasus ketika terdapat beberapa mode).

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

Forward Fill dengan ffill()

Forward fill (juga disebut last-observation-carried-forward, LOCF) meneruskan nilai terakhir yang valid (bukan NaN) ke depan untuk mengisi posisi NaN berikutnya. Metode ini ideal untuk data deret waktu ketika suatu pengukuran tetap konstan hingga diperbarui — misalnya, status perangkat, tingkat harga, atau pembacaan sensor yang hanya berubah pada kejadian 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

Backward Fill dengan bfill()

Backward fill (next-observation-carried-backward, NOCB) meneruskan nilai valid berikutnya ke belakang untuk mengisi posisi NaN sebelumnya. Metode ini berguna ketika Anda mengetahui bahwa data di masa depan dapat mengisi nilai masa lalu yang hilang — misalnya, jika Anda menerima data akhir bulan dan perlu mengisi mundur 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 Forward dan Backward Fill

Baik ffill() maupun bfill() menerima parameter limit yang membatasi jumlah nilai NaN berurutan yang diisi. Hal ini penting ketika Anda hanya ingin meneruskan suatu nilai untuk celah yang singkat — celah yang panjang sebaiknya tetap berupa NaN untuk menandakan bahwa data tersebut benar-benar hilang, bukan sekadar terlambat.

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 Kolom yang Berbeda dengan Cara Berbeda

Dalam DataFrame nyata, kolom yang berbeda mungkin memerlukan strategi pengisian yang berbeda. Berikan kamus ke fillna(), dengan kunci berupa nama kolom dan nilai berupa nilai pengisi. Ini menerapkan imputasi khusus untuk setiap kolom dalam satu pemanggilan, sehingga lebih rapi daripada merangkai beberapa pemanggilan fillna secara terpisah.

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 Berbasis Kelompok

Strategi yang lebih canggih adalah mengisi nilai NaN dengan mean atau median kelompok, bukan mean kolom secara keseluruhan. Misalnya, mengisi gaji yang hilang dengan median gaji untuk kategori pekerjaan tersebut. Metode ini mempertahankan struktur subkelompok dan menghasilkan imputasi yang lebih realistis daripada 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 Penanda Konstan

Terkadang, imputasi yang tepat adalah nilai penanda yang menunjukkan “tidak diketahui”, bukan pengukuran sebenarnya. Misalnya, -1 untuk usia yang tidak diketahui, 'N/A' untuk kategori yang tidak diketahui, atau False untuk penanda boolean yang tidak diketahui. Nilai penanda sah digunakan jika kode berikutnya secara eksplisit memeriksanya dan memperlakukannya secara berbeda dari data nyata.

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

Merangkai fillna() dalam Alur

Seperti semua metode Pandas, fillna() mengembalikan DataFrame baru dan terintegrasi dengan baik ke dalam rangkaian metode. Memanggil .fillna() setelah .dropna() menerapkan strategi dua langkah: hapus baris yang tidak memiliki kolom penting, lalu isi nilai NaN opsional yang tersisa dengan nilai bawaan yang masuk akal — semuanya dalam satu alur 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

Memastikan Tidak Ada NaN yang Tersisa

Setelah imputasi, selalu pastikan bahwa tidak ada nilai NaN yang tersisa pada kolom yang Anda targetkan. Panggil df.isna().sum() atau pastikan jumlahnya nol. Jumlah yang tidak nol secara tak terduga berarti fillna Anda melewatkan suatu kasus — mungkin suatu kolom memiliki dtype yang mencegah pengisian, atau Anda lupa menyertakan kolom 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

Pemeriksaan Singkat

Uji pemahaman Anda tentang pengisian nilai yang hilang dalam Pandas.

Ringkasan Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa fillna(scalar) mengganti semua NaN dengan konstanta, fillna(mean/median) melakukan imputasi menggunakan statistik kolom, dan ffill()/bfill() meneruskan nilai di sekitar untuk deret waktu. Berikan kamus ke fillna() untuk strategi khusus kolom, dan gunakan groupby().transform() untuk imputasi berbasis kelompok. Selanjutnya, kita akan membahas interpolasi dan kapan memilih teknik imputasi tingkat lanjut.

Gratis untuk memulai

Belajar Python dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
30
Pelajaran
120

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengisi Nilai yang Hilang” gratis?

Ya — teks lengkap “Mengisi Nilai yang Hilang” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengisi Nilai yang Hilang”?

Ganti NaN dengan konstanta, rata-rata kolom, pengisian ke depan, atau pengisian ke belakang menggunakan fillna() dan parameter method-nya. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Mengisi Nilai yang Hilang” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendeteksi Nilai yang Hilang
  2. Menghapus Nilai yang Hilang
  3. Mengisi Nilai yang Hilang
  4. Interpolasi dan Imputasi Lanjutan
← Kembali ke Pandas & NumPy Academy