Apakah ada cara yang disukai untuk menjaga tipe data numpy
array tetap sebagai int
(atau int64
atau apa pun), sementara masih memiliki elemen di dalamnya terdaftar sebagai numpy.NaN
?
Secara khusus, saya mengonversi struktur data in-house menjadi PandF DataFrame. Dalam struktur kami, kami memiliki kolom tipe integer yang masih memiliki NaN (tetapi tipe kolom adalah int). Tampaknya akan menampilkan kembali semuanya sebagai pelampung jika kita menjadikan ini sebagai DataFrame, tetapi kami benar-benar ingin melakukannya int
.
Pikiran?
Hal yang dicoba:
Saya mencoba menggunakan from_records()
fungsi di bawah pandas.DataFrame, dengan coerce_float=False
dan ini tidak membantu. Saya juga mencoba menggunakan array bertopeng NumPy, dengan fillNvalue NaN, yang juga tidak berfungsi. Semua ini menyebabkan tipe data kolom menjadi float.
from_records
fungsi di bawah pandas.DataFrame, dengancoerce_float=False
, tetapi tidak berhasil ... masih membuat data baru memiliki tipefloat64
.Jawaban:
Kemampuan ini telah ditambahkan ke panda (dimulai dengan versi 0.24): https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support
Pada titik ini, ini memerlukan penggunaan ekstensi dtype Int64 (huruf besar), daripada standar dtype int64 (huruf kecil).
sumber
'Int64'
membuatnya berfungsi. Akan lebih baik lagi jika diaktifkan secara default.'Int64'
atau ada sesuatu seperti itu'Int8'
? Ini menggunakan jumlah memori yang gila dibandingkan dengannp.float
.'Int8'
tampaknya bekerja, tetapinp.float
tampaknya memuat dengan cara yang lebih cepat. Masalahnya tampaknya itu tidak melepaskan peralihan memori. Asumsikan pengumpul sampah pada akhirnya akan berjalan.NaN
tidak dapat disimpan dalam array integer. Ini adalah batasan panda yang diketahui saat ini; Saya telah menunggu kemajuan yang dibuat dengan nilai-nilai NA di NumPy (mirip dengan NAs dalam R), tetapi setidaknya 6 bulan hingga setahun sebelum NumPy mendapatkan fitur-fitur ini, tampaknya:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(Fitur ini telah ditambahkan dimulai dengan versi 0.24 dari panda, tetapi perhatikan itu membutuhkan penggunaan ekstensi dtype Int64 (huruf besar), daripada standar dtype int64 (huruf kecil): https://pandas.pydata.org/pandas- docs / version / 0.24 / whatsnew / v0.24.0.html # opsional-integer-na-support )
sumber
Jika kinerja bukan masalah utama, Anda dapat menyimpan string sebagai gantinya.
Kemudian Anda dapat mencampurnya dengan
NaN
sebanyak yang Anda inginkan. Jika Anda benar-benar ingin memiliki bilangan bulat, tergantung pada aplikasi Anda, Anda dapat menggunakan-1
, atau0
, atau1234567890
, beberapa nilai khusus lainnya untuk mewakiliNaN
.Anda juga dapat menduplikasi kolom untuk sementara: satu seperti yang Anda miliki, dengan float; yang lain eksperimental, dengan int atau string. Kemudian sisipkan
asserts
di setiap tempat yang wajar untuk memeriksa apakah keduanya sinkron. Setelah cukup pengujian Anda bisa melepaskan mengapung.sumber
Ini bukan solusi untuk semua kasus, tetapi milik saya (koordinat genomik) Saya telah menggunakan 0 sebagai NaN
Ini setidaknya memungkinkan untuk jenis kolom 'asli' yang tepat untuk digunakan, operasi seperti pengurangan, perbandingan dll berfungsi seperti yang diharapkan
sumber
Pandas v0.24 +
Fungsi untuk mendukung
NaN
dalam seri integer akan tersedia di v0.24 ke atas. Ada informasi tentang ini di bagian "Apa yang Baru" di v0.24, dan lebih detail di bawah Tipe Data Integer Nullable .Panda v0.23 dan sebelumnya
Secara umum, yang terbaik untuk bekerja dengan
float
seri mana mungkin, bahkan ketika seri ini upcast dariint
kefloat
akibat masuknyaNaN
nilai-nilai. Ini memungkinkan perhitungan berbasis NumPy yang vektor di mana, jika tidak, loop tingkat Python akan diproses.Dokumen memang menyarankan : "Satu kemungkinan adalah menggunakan
dtype=object
array sebagai gantinya." Sebagai contoh:Untuk alasan kosmetik, misalnya keluaran ke file, ini mungkin lebih disukai.
Pandas v0.23 dan sebelumnya: latar belakang
NaN
dianggap afloat
. The docs saat ini (per v0.23) menentukan alasan mengapa seri integer upcasted kefloat
:Dokumen juga memberikan aturan untuk upcasting karena
NaN
dimasukkan:sumber
Ini sekarang mungkin, karena panda v 0.24.0
panda 0.24.x catatan rilis Quote: " Pandas telah memperoleh kemampuan untuk menahan dtypes integer dengan nilai yang hilang.
sumber
Hanya ingin menambahkan bahwa jika Anda mencoba untuk mengkonversi vektor float (1.143) ke integer (1) yang memiliki NA mengkonversi ke dtype 'Int64' baru akan memberi Anda kesalahan. Untuk menyelesaikan ini, Anda harus membulatkan angka dan kemudian melakukan ".astype ('Int64')"
Kasus penggunaan saya adalah bahwa saya memiliki seri float yang ingin saya bulatkan ke int, tetapi ketika Anda melakukannya .round () a '* .0' di akhir bilangan tetap, sehingga Anda dapat menjatuhkan 0 itu dari akhir dengan mengkonversi ke int.
sumber
Jika ada kosong dalam data teks, kolom yang biasanya menjadi bilangan bulat akan dilemparkan ke float64 dtype karena int64 dtype tidak dapat menangani nulls. Ini dapat menyebabkan skema yang tidak konsisten jika Anda memuat beberapa file beberapa dengan kosong (yang akan berakhir sebagai float64 dan lainnya tanpa yang akan berakhir sebagai int64
Kode ini akan mencoba untuk mengkonversi kolom tipe nomor apa pun ke Int64 (sebagai lawan int64) karena Int64 dapat menangani nulls
sumber