Hapus nan dari objek python

Perbedaan antara data yang ditemukan di banyak tutorial dan data di dunia nyata adalah bahwa data dunia nyata jarang bersih dan homogen. Secara khusus, banyak kumpulan data yang menarik akan kehilangan sejumlah data. Lebih rumit lagi, sumber data yang berbeda mungkin menunjukkan data yang hilang dengan cara yang berbeda

Pada bagian ini, kita akan membahas beberapa pertimbangan umum untuk data yang hilang, mendiskusikan bagaimana Panda memilih untuk merepresentasikannya, dan mendemonstrasikan beberapa alat Pandas bawaan untuk menangani data yang hilang di Python. Di sini dan di sepanjang buku ini, kami akan mengacu pada data yang hilang secara umum sebagai nilai null, NaN, atau NA

Trade-Off dalam Konvensi Data yang Hilang

Ada sejumlah skema yang telah dikembangkan untuk menunjukkan adanya data yang hilang dalam sebuah tabel atau DataFrame. Umumnya, mereka berputar di sekitar salah satu dari dua strategi. menggunakan topeng yang secara global menunjukkan nilai yang hilang, atau memilih nilai sentinel yang menunjukkan entri yang hilang

Dalam pendekatan masking, mask mungkin merupakan array Boolean yang sepenuhnya terpisah, atau mungkin melibatkan apropriasi satu bit dalam representasi data untuk secara lokal menunjukkan status null dari suatu nilai.

Dalam pendekatan sentinel, nilai sentinel dapat berupa konvensi khusus data, seperti menunjukkan nilai bilangan bulat yang hilang dengan -9999 atau beberapa pola bit langka, atau dapat berupa konvensi yang lebih global, seperti menunjukkan nilai floating-point yang hilang

Tak satu pun dari pendekatan ini tanpa kompromi. penggunaan larik topeng terpisah memerlukan alokasi larik Boolean tambahan, yang menambahkan overhead dalam penyimpanan dan perhitungan. Nilai sentinel mengurangi rentang nilai valid yang dapat direpresentasikan, dan mungkin memerlukan logika ekstra (seringkali tidak dioptimalkan) dalam aritmatika CPU dan GPU. Nilai khusus umum seperti NaN tidak tersedia untuk semua tipe data

Seperti dalam kebanyakan kasus di mana tidak ada pilihan optimal universal, bahasa dan sistem yang berbeda menggunakan konvensi yang berbeda. Misalnya, bahasa R menggunakan pola bit yang dicadangkan dalam setiap tipe data sebagai nilai sentinel yang menunjukkan data yang hilang, sedangkan sistem SciDB menggunakan byte tambahan yang dilampirkan ke setiap sel yang menunjukkan status NA.

Data Hilang di Pandas

Cara Panda menangani nilai yang hilang dibatasi oleh ketergantungannya pada paket NumPy, yang tidak memiliki gagasan bawaan tentang nilai NA untuk tipe data non-floating-point

Panda bisa mengikuti jejak R dalam menentukan pola bit untuk setiap tipe data individual untuk menunjukkan nullness, tetapi pendekatan ini ternyata agak berat. Sementara R berisi empat tipe data dasar, NumPy mendukung lebih dari ini. misalnya, sementara R memiliki tipe bilangan bulat tunggal, NumPy mendukung empat belas tipe bilangan bulat dasar setelah Anda memperhitungkan ketepatan, keabsahan, dan ketetapan pengkodean yang tersedia. Mencadangkan pola bit tertentu di semua jenis NumPy yang tersedia akan menyebabkan jumlah overhead yang berat dalam berbagai operasi casing khusus untuk berbagai jenis, bahkan kemungkinan membutuhkan fork baru dari paket NumPy. Selanjutnya, untuk tipe data yang lebih kecil (seperti bilangan bulat 8-bit), mengorbankan sedikit untuk digunakan sebagai topeng akan secara signifikan mengurangi rentang nilai yang dapat diwakilinya.

NumPy memiliki dukungan untuk array bertopeng – yaitu, array yang memiliki array topeng Boolean terpisah yang dilampirkan untuk menandai data sebagai "baik" atau "buruk. " Panda bisa jadi berasal dari ini, tetapi overhead dalam penyimpanan, komputasi, dan pemeliharaan kode menjadikannya pilihan yang tidak menarik

Dengan mempertimbangkan batasan ini, Panda memilih untuk menggunakan sentinel untuk data yang hilang, dan selanjutnya memilih untuk menggunakan dua nilai nol Python yang sudah ada. nilai titik-mengambang khusus dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _6, dan objek Python dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7. Pilihan ini memiliki beberapa efek samping, seperti yang akan kita lihat, tetapi dalam praktiknya akhirnya menjadi kompromi yang baik dalam banyak kasus yang menarik

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _7. Data Pythonic hilang

Nilai sentinel pertama yang digunakan oleh Panda adalah dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7, objek tunggal Python yang sering digunakan untuk data yang hilang dalam kode Python. Karena ini adalah objek Python, dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _7 tidak dapat digunakan dalam sembarang array NumPy/Pandas, tetapi hanya dalam array dengan tipe data vals1.sum() 1 (i. e. , array objek Python)

Dalam [1]

import numpy as np import pandas as pd _

Di [2]

vals1 = np.array([1, None, 3, 4]) vals1

Keluar[2]

array([1, None, 3, 4], dtype=object)_

vals1.sum() _2 ini berarti bahwa representasi tipe umum terbaik yang dapat disimpulkan oleh NumPy untuk konten array adalah bahwa mereka adalah objek Python. Meskipun array objek semacam ini berguna untuk beberapa tujuan, setiap operasi pada data akan dilakukan pada tingkat Python, dengan lebih banyak overhead daripada operasi cepat yang biasanya terlihat untuk array dengan tipe asli

Dalam [3]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print()

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop

Penggunaan objek Python dalam array juga berarti bahwa jika Anda melakukan agregasi seperti vals1.sum() 3 atau vals1.sum() 4 melintasi array dengan nilai dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7, Anda biasanya akan mendapatkan kesalahan

Di [4]

vals1.sum()

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-749fd8ae6030> in <module>() ----> 1 vals1.sum() /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims) 30 31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): ---> 32 return umr_sum(a, axis, dtype, out, keepdims) 33 34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

Ini mencerminkan fakta bahwa penambahan antara bilangan bulat dan dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7 tidak terdefinisi

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _6. Data numerik tidak ada

Representasi data lain yang hilang, dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _6 (singkatan dari Not a Number), berbeda;

Dalam [5]

vals2 = np.array([1, np.nan, 3, 4]) vals2.dtype

Keluar[5]

dtype('float64')

Perhatikan bahwa NumPy memilih tipe floating-point asli untuk array ini. ini berarti bahwa tidak seperti larik objek sebelumnya, larik ini mendukung operasi cepat yang dimasukkan ke dalam kode yang dikompilasi. Anda harus menyadari bahwa dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 6 sedikit mirip dengan virus data–ia menginfeksi objek lain yang disentuhnya. Terlepas dari operasinya, hasil aritmatika dengan dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 6 akan menjadi dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 6 lainnya

Di [6]

1 + np.nan

Keluar[6]

vals1 = np.array([1, None, 3, 4]) vals1 0

Di [7]

vals1 = np.array([1, None, 3, 4]) vals1 1

Keluar[7]

vals1 = np.array([1, None, 3, 4]) vals1 0

Perhatikan bahwa ini berarti bahwa agregat atas nilai didefinisikan dengan baik (mis. e. , mereka tidak menghasilkan kesalahan) tetapi tidak selalu berguna

Di [8]

vals1 = np.array([1, None, 3, 4]) vals1 3

Keluar[8]

vals1 = np.array([1, None, 3, 4]) vals1 4

NumPy memang menyediakan beberapa agregasi khusus yang akan mengabaikan nilai yang hilang ini

Dalam [9]

vals1 = np.array([1, None, 3, 4]) vals1 5

Keluar[9]

vals1 = np.array([1, None, 3, 4]) vals1 6

Perlu diingat bahwa dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _6 secara khusus merupakan nilai floating-point;

NaN dan Tidak Ada di Panda

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 6 dan dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7 keduanya memiliki tempatnya masing-masing, dan Panda dibangun untuk menangani keduanya hampir secara bergantian, mengubah di antara keduanya jika perlu

Di [10]

vals1 = np.array([1, None, 3, 4]) vals1 7

Keluar[10]

vals1 = np.array([1, None, 3, 4]) vals1 _8

Untuk tipe yang tidak memiliki nilai sentinel yang tersedia, Pandas secara otomatis mengetik ketika nilai NA ada. Misalnya, jika kita menetapkan nilai dalam larik bilangan bulat ke --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-749fd8ae6030> in <module>() ----> 1 vals1.sum() /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims) 30 31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): ---> 32 return umr_sum(a, axis, dtype, out, keepdims) 33 34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'5, maka secara otomatis akan dialihkan ke tipe floating-point untuk mengakomodasi NA

Di [11]

vals1 = np.array([1, None, 3, 4]) vals1 _9

Keluar[11]

array([1, None, 3, 4], dtype=object)_0

Dalam [12]

array([1, None, 3, 4], dtype=object)_1

Keluar[12]

array([1, None, 3, 4], dtype=object)_2

Perhatikan bahwa selain mentransmisi array bilangan bulat ke floating point, Panda secara otomatis mengonversi nilai dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7 menjadi nilai dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 6. (Ketahuilah bahwa ada proposal untuk menambahkan bilangan bulat asli NA ke Pandas di masa mendatang; hingga tulisan ini dibuat, itu belum disertakan)

Sementara jenis sihir ini mungkin terasa sedikit meretas dibandingkan dengan pendekatan yang lebih terpadu untuk nilai NA dalam bahasa khusus domain seperti R, pendekatan sentinel/casting Panda bekerja cukup baik dalam praktiknya dan menurut pengalaman saya jarang menyebabkan masalah

Tabel berikut mencantumkan konvensi upcasting di Pandas saat nilai NA diperkenalkan

TypeclassConversion Saat menyimpan nilai sentinel nasna--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-749fd8ae6030> in <module>() ----> 1 vals1.sum() /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims) 30 31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): ---> 32 return umr_sum(a, axis, dtype, out, keepdims) 33 34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'8no perubahan--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-749fd8ae6030> in <module>() ----> 1 vals1.sum() /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims) 30 31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): ---> 32 return umr_sum(a, axis, dtype, out, keepdims) 33 34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'5vals2 = np.array([1, np.nan, 3, 4]) vals2.dtype 0 tidak berubah____0___________7 atau --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-749fd8ae6030> in <module>() ----> 1 vals1.sum() /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims) 30 31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False): ---> 32 return umr_sum(a, axis, dtype, out, keepdims) 33 34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'5___________________________________________________________________________________________.

Perlu diingat bahwa di Pandas, data string selalu disimpan dengan tipe vals2 = np.array([1, np.nan, 3, 4]) vals2.dtype 0

Beroperasi pada Nilai Null

Seperti yang telah kita lihat, Panda memperlakukan dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 7 dan dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 6 pada dasarnya dapat dipertukarkan untuk menunjukkan nilai yang hilang atau nol. Untuk memfasilitasi konvensi ini, ada beberapa metode berguna untuk mendeteksi, menghapus, dan mengganti nilai nol dalam struktur data Pandas. Mereka

  • dtype('float64')3. Hasilkan topeng boolean yang menunjukkan nilai yang hilang
  • dtype('float64')4. Kebalikan dari dtype('float64')3
  • dtype('float64')6. Kembalikan versi data yang difilter
  • dtype('float64')7. Kembalikan salinan data dengan nilai yang hilang diisi atau diperhitungkan

Kami akan mengakhiri bagian ini dengan eksplorasi singkat dan demonstrasi rutinitas ini

Mendeteksi nilai null

Struktur data panda memiliki dua metode yang berguna untuk mendeteksi data null. dtype('float64')3 dan dtype('float64')4. Salah satunya akan mengembalikan topeng Boolean di atas data. Sebagai contoh

Di [13]

array([1, None, 3, 4], dtype=object)_3

Dalam [14]

array([1, None, 3, 4], dtype=object)_4

Keluar[14]

array([1, None, 3, 4], dtype=object)_5

Seperti disebutkan dalam Pengindeksan dan Pemilihan Data, topeng Boolean dapat digunakan secara langsung sebagai indeks 1 + np.nan 0 atau 1 + np.nan 1

Di [15]

array([1, None, 3, 4], dtype=object)_6

Keluar[15]

array([1, None, 3, 4], dtype=object)_7

Metode dtype('float64')_3 dan dtype('float64')4 menghasilkan hasil Boolean yang serupa untuk 1 + np.nan 1s

Menjatuhkan nilai nol

Selain masking yang digunakan sebelumnya, ada metode praktis, dtype('float64')6 (yang menghilangkan nilai NA) dan dtype('float64')7 (yang mengisi nilai NA). Untuk 1 + np.nan _0, hasilnya langsung

Dalam [16]

array([1, None, 3, 4], dtype=object)_8

Keluar[16]

array([1, None, 3, 4], dtype=object)_7

Untuk 1 + np.nan _1, ada lebih banyak opsi. Pertimbangkan hal berikut 1 + np.nan _1

Dalam [17]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _0

Keluar[17]

01201. 0NaN212. 03. 052NaN4. 06

Kami tidak dapat menghapus nilai tunggal dari 1 + np.nan 1; . Bergantung pada aplikasinya, Anda mungkin menginginkan satu atau yang lain, jadi dtype('float64')6 memberikan sejumlah opsi untuk 1 + np.nan 1

Secara default, dtype('float64')_6 akan menghapus semua baris yang berisi nilai null

Dalam [18]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _1

Keluar[18]

01212. 03. 05

Alternatifnya, Anda dapat membuang nilai NA di sepanjang sumbu yang berbeda;

Dalam [19]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _2

Keluar[19]

2021526

Tapi ini juga memberikan beberapa data bagus; . Ini dapat ditentukan melalui parameter vals1 = np.array([1, None, 3, 4]) vals1 _05 atau vals1 = np.array([1, None, 3, 4]) vals1 06, yang memungkinkan kontrol yang baik atas jumlah nol yang diizinkan

Standarnya adalah vals1 = np.array([1, None, 3, 4]) vals1 _07, sehingga setiap baris atau kolom (bergantung pada kata kunci vals1 = np.array([1, None, 3, 4]) vals1 08) yang berisi nilai nol akan dibuang. Anda juga dapat menentukan vals1 = np.array([1, None, 3, 4]) vals1 09, yang hanya akan menghapus baris/kolom yang semuanya bernilai nol

Dalam [20]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _3

Keluar[20]

012301. 0NaN2NaN12. 03. 05NaN2NaN4. 06NaN

Dalam [21]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _4

Keluar[21]

01201. 0NaN212. 03. 052NaN4. 06

Untuk kontrol yang lebih halus, parameter vals1 = np.array([1, None, 3, 4]) vals1 _06 memungkinkan Anda menentukan jumlah minimum nilai non-null untuk baris/kolom yang akan dipertahankan

Di [22]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _5

Keluar[22]

012312. 03. 05NaN

Di sini baris pertama dan terakhir telah dihapus, karena hanya berisi dua nilai bukan nol

Mengisi nilai null

Terkadang daripada menghilangkan nilai NA, Anda lebih suka menggantinya dengan nilai yang valid. Nilai ini mungkin berupa angka tunggal seperti nol, atau mungkin semacam imputasi atau interpolasi dari nilai yang baik. Anda bisa melakukan ini di tempat menggunakan metode dtype('float64')_3 sebagai topeng, tetapi karena ini adalah operasi yang umum, Pandas menyediakan metode dtype('float64')7, yang mengembalikan salinan array dengan nilai null diganti

Perhatikan 1 + np.nan 0 berikut ini

Dalam [23]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _6

Keluar[23]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _7

Kita dapat mengisi entri NA dengan satu nilai, seperti nol

Di [24]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _8

Keluar[24]

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() _9

Kita dapat menentukan forward-fill untuk menyebarkan nilai sebelumnya ke depan

Dalam [25]

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 0

Keluar[25]

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _1

Atau kita dapat menentukan back-fill untuk menyebarkan nilai berikutnya ke belakang

Dalam [26]

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _2

Keluar[26]

dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop _3

Untuk 1 + np.nan _1s, opsinya serupa, tetapi kami juga dapat menentukan vals1 = np.array([1, None, 3, 4]) vals1 08 di mana pengisian berlangsung

Bagaimana Anda menghapus NaN dari objek dengan Python?

Gunakan Metode isnull() Untuk Menghapus Nilai NaN Dari Seri .

Bagaimana cara menyingkirkan NaN?

5 cara sederhana untuk menangani NaN di data Anda .
Menjatuhkan hanya nilai nol berdasarkan baris. Terkadang Anda hanya perlu menghapus beberapa baris yang berisi nilai nol. .
Mengisi nilai null dengan nilai. .
Mengisi sel yang berisi nilai NaN dengan entri sebelumnya. .
Iterasi melalui kolom & melakukan operasi pada Non NaN

Bagaimana cara menghapus nilai NaN di panda?

Fungsi dropna panda .
Sintaksis. panda. Bingkai Data. dropna(axis = 0, how ='any', thresh = None, subset = None, inplace=False)
Tujuan. Untuk menghapus nilai yang hilang dari DataFrame
Parameter. sumbu. 0 atau 1 (default. 0). .
Pengembalian. Jika inplace disetel ke 'True' maka Tidak Ada. Jika disetel ke 'False', maka DataFrame

Postingan terbaru

LIHAT SEMUA