Nilai yang hilang adalah umum dan terjadi baik karena kesalahan manusia, kesalahan instrumen, pemrosesan dari tim lain, atau karena kurangnya data untuk pengamatan tertentu.
Dalam Byte ini, kita akan melihat bagaimana cara mengisi NaN dalam a
DataFrame
, jika Anda memilih untuk menangani NaN dengan mengisinya.
Pertama, mari kita buat tiruan DataFrame
dengan beberapa nilai acak keluar:
import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan
df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
Col1 Col2 Col3
0 -0.671603 -0.792415 0.783922
1 0.207720 NaN 0.996131
2 -0.892115 -1.282333 NaN
3 -0.315598 -2.371529 -1.959646
4 NaN NaN -0.584636
5 0.314736 -0.692732 -0.303951
6 0.355121 NaN NaN
7 NaN -1.900148 1.230828
8 -1.795468 0.490953 NaN
9 -0.678491 -0.087815 NaN
10 0.755714 0.550589 -0.702019
11 0.951908 -0.529933 0.344544
12 NaN 0.075340 -0.187669
13 NaN 0.314342 -0.936066
14 NaN 1.293355 0.098964
Mari kita plot, katakanlah, kolom ketiga:
plt.plot(df['Col3'])
Saat diisi dengan berbagai teknik โ grafik yang diisi NaN ini dapat diganti dengan:
fillna() โ Rata-rata, Median, Modus
Anda dapat mengisi nilai-nilai ini ke dalam kolom baru dan menetapkannya ke kolom yang ingin Anda isi, atau di tempat menggunakan inplace
argumen. Di sini, kami akan mengekstrak nilai yang diisi di kolom baru untuk memudahkan pemeriksaan:
mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)
Median, mean, dan modus kolom tersebut adalah -0.187669
, -0.110873
dan 0.000000
dan nilai-nilai ini akan digunakan untuk setiap NaN masing-masing. Ini secara efektif mengisi dengan nilai konstan, di mana nilai yang dimasukkan tergantung pada entri kolom.
Pertama, mengisi dengan nilai median menghasilkan:
Dengan nilai rata-rata:
Dengan nilai modus:
fillna() โ Nilai Konstan
Anda juga dapat mengisi dengan nilai konstan sebagai gantinya:
Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!
constant = df['Col3'].fillna(0, inplace=False
Ini menghasilkan nilai konstan (0) yang ditempatkan sebagai ganti setiap NaN. 0
dekat dengan median dan mean kami dan sama dengan mode, sehingga nilai yang diisi akan sangat mirip dengan metode tersebut untuk dataset tiruan kami:
0 0.783922
1 0.996131
2 0.000000
3 -1.959646
4 -0.584636
5 -0.303951
6 0.000000
7 1.230828
8 0.000000
9 0.000000
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
fillna() โ Isi Maju dan Mundur
Pada setiap baris โ Anda dapat melakukan pengisian maju atau mundur, dengan mengambil nilai dari baris sebelum atau sesudah:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
Dengan forward-filling, karena kita tidak ada di baris 2 โ nilai dari baris 1 diambil untuk mengisi baris kedua. Nilai menyebar ke depan:
0 0.783922
1 0.996131
2 0.996131
3 -1.959646
4 -0.584636
5 -0.303951
6 -0.303951
7 1.230828
8 1.230828
9 1.230828
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
Dengan pengisian ke belakang, yang terjadi sebaliknya. Baris 2 diisi dengan nilai dari baris 3:
0 0.783922
1 0.996131
2 -1.959646
3 -1.959646
4 -0.584636
5 -0.303951
6 1.230828
7 1.230828
8 -0.702019
9 -0.702019
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
Padahal, jika ada lebih dari satu NaN
secara berurutan โ ini tidak akan berjalan dengan baik dan dapat mengalirkan NaN lebih jauh ke bawah, mencondongkan data dan menghapus nilai yang sebenarnya direkam.
menambah()
Grafik interpolate()
metode mendelegasikan interpolasi nilai ke SciPy's rangkaian metode untuk menginterpolasi nilai. Ia menerima berbagai macam argumen, termasuk, nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
, Dll
Interpolasi jauh lebih fleksibel dan โpintarโ dari sekedar mengisi nilai dengan konstanta atau setengah variabel seperti metode sebelumnya.
Interpolasi dapat mengisi urutan dengan benar dengan cara yang tidak dapat dilakukan oleh metode lain, seperti:
s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
s.fillna(method='ffill').values
s.interpolate().values
Interpolasi default adalah linier, dan dengan asumsi bahwa 1...5
kemungkinan besar 1, 2, 3, 4, 5
urutannya tidak terlalu mengada-ada (tetapi tidak dijamin). Baik pengisian konstan dan pengisian maju atau mundur gagal total di sini. Secara umum โ interpolasi biasanya akan menjadi teman baik dalam hal mengisi NaN dalam sinyal yang bising, atau kumpulan data yang rusak.
Bereksperimen dengan jenis interpolasi dapat menghasilkan hasil yang lebih baik.
Berikut adalah dua metode interpolasi (splice
dan polynomial
membutuhkan sebuah order
argumen):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
Ini menghasilkan:
Dan: