Saya membaca dua kolom file csv menggunakan panda readcsv()
dan kemudian menetapkan nilainya ke kamus. Kolom berisi rangkaian angka dan huruf. Terkadang ada kasus di mana sel kosong. Menurut pendapat saya, nilai yang dibaca untuk entri kamus itu harus None
tetapi nan
ditetapkan. Tentunya None
lebih deskriptif dari sel kosong karena memiliki nilai null, sedangkan nan
hanya mengatakan bahwa nilai yang dibaca bukanlah angka.
Apakah pemahaman saya benar, apa perbedaan antara None
dan nan
? Mengapa nan
ditugaskan alih-alih None
?
Juga, kamus saya memeriksa apakah ada sel kosong yang telah digunakan numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
Tetapi ini memberi saya kesalahan yang mengatakan bahwa saya tidak dapat menggunakan pemeriksaan ini v
. Saya kira itu karena variabel integer atau float, bukan string yang dimaksudkan untuk digunakan. Jika ini benar, bagaimana cara memeriksa v
kotak / "sel kosong" nan
?
qwerty
itu bukan angka.None
akan menjadi deskripsi yang lebih baik tentang nilai sel kosong.Jawaban:
NaN digunakan sebagai placeholder untuk data yang hilang secara konsisten di panda , konsistensinya bagus. Saya biasanya membaca / menerjemahkan NaN sebagai "hilang" . Lihat juga bagian 'bekerja dengan data yang hilang' di dokumen.
Kami menulis dalam 'pilihan representasi NA' dokumen :
Catatan: "Gotcha" bahwa Seri bilangan bulat yang berisi data yang hilang di-upcast menjadi float .
Menurut pendapat saya, alasan utama untuk menggunakan NaN (over None) adalah karena NaN dapat disimpan dengan dtype float64 numpy, daripada dtype objek yang kurang efisien, lihat promosi tipe NA .
# without forcing dtype it changes None to NaN! s_bad = pd.Series([1, None], dtype=object) s_good = pd.Series([1, np.nan]) In [13]: s_bad.dtype Out[13]: dtype('O') In [14]: s_good.dtype Out[14]: dtype('float64')
Jeff berkomentar (di bawah) tentang ini:
Mengatakan itu, banyak operasi mungkin masih bekerja dengan baik dengan None vs NaN (tetapi mungkin tidak didukung, yaitu terkadang memberikan hasil yang mengejutkan ):
In [15]: s_bad.sum() Out[15]: 1 In [16]: s_good.sum() Out[16]: 1.0
Untuk menjawab pertanyaan kedua:
Anda harus menggunakan
pd.isnull
danpd.notnull
untuk menguji data yang hilang (NaN).sumber
np.nan
memungkinkan untuk operasi vektor; ini adalah nilai float, sedangkanNone
menurut definisiobject
jenis gaya , dan pada dasarnya menonaktifkan semua efisiensi di numpy, jadi ulangi 3 kali dengan cepat:object==bad, float==good
<NA>
juganp.nan
?NaN
dapat digunakan sebagai nilai numerik pada operasi matematika, sementaraNone
tidak bisa (atau setidaknya tidak boleh).NaN
adalah nilai numerik, seperti yang didefinisikan dalam standar floating-point IEEE 754 .None
adalah jenis Python internal (NoneType
) dan akan lebih seperti "tidak ada" atau "kosong" daripada "tidak valid secara numerik" dalam konteks ini."Gejala" utama dari hal itu adalah, jika Anda melakukan, katakanlah, rata-rata atau jumlah pada larik yang berisi NaN, bahkan satu, Anda mendapatkan NaN sebagai hasilnya ...
Di sisi lain, Anda tidak dapat melakukan operasi matematika menggunakan
None
operand.Jadi, bergantung pada kasusnya, Anda dapat menggunakan
None
sebagai cara untuk memberi tahu algoritme Anda agar tidak mempertimbangkan nilai yang tidak valid atau tidak ada pada komputasi. Itu berarti algoritme harus menguji setiap nilai untuk melihat apakah benarNone
.Numpy memiliki beberapa fungsi untuk menghindari nilai NaN mencemari hasil Anda, seperti
nansum
dannan_to_num
misalnya.sumber
df=pd.readcsv('file.csv')
memberi sayaNaN
nilai untuk sel kosong dan tidakNone
? Sejauh yang saya tahu, pd.DataFrames tidak eksklusif untuk angka.dtype
, jadi nilai yang tidak validdtype=float
harus diwakili oleh nilai numerik, yang manaNaN
danNone
bukan (None
dariNoneType
).na
argumen, yang memungkinkan Anda memutuskan nilai mana yang akan Anda gunakan untuk mengganti nilai yang tidak tersediaFungsi ini
isnan()
memeriksa untuk melihat apakah ada sesuatu yang "Bukan Angka" dan akan mengembalikan apakah variabel adalah angka atau tidak, misalnyaisnan(2)
akan mengembalikan salahPengembalian bersyarat
myVar is not None
apakah variabel ditentukan atau tidakArray numpy Anda menggunakan
isnan()
karena dimaksudkan sebagai larik angka dan menginisialisasi semua elemen larik keNaN
elemen ini dianggap "kosong"sumber
isnan(2)
akan kembaliFalse
, karena 2 bukan NaN.numpy.empty
tidak menginisialisasi nilai array keNaN
. Itu sama sekali tidak menginisialisasi nilai sama sekali.None
-ness adalahmyVar is not None
, bukanmyVar != None
.np.isnan()
tidak diimplementasikan untuk variabel string, jadi jika Anda meneruskannya string itu akan macet. Lebih baik menggunakanpd.isnull
yang bekerja dengan string.Berikut perbedaannya:
nan
milik kelasfloat
None
milik kelasNoneType
Saya menemukan artikel di bawah ini sangat membantu: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
sumber
NaN
stants untuk BUKAN nomor .None
mungkin berdiri untuk apapun .sumber