Saya membaca data dari file .csv ke bingkai data Pandas seperti di bawah ini. Untuk salah satu kolom, yaitu id
, saya ingin menentukan jenis kolom sebagai int
. Masalahnya adalah id
seri memiliki nilai yang hilang / kosong.
Ketika saya mencoba untuk melemparkan id
kolom ke integer saat membaca .csv, saya mendapatkan:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
Atau, saya mencoba mengonversi jenis kolom setelah membaca seperti di bawah ini, tetapi kali ini saya mendapatkan:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
Bagaimana saya bisa mengatasi ini?
Jawaban:
Kurangnya rep NaN dalam kolom integer adalah panda "gotcha" .
Solusi yang biasa adalah dengan hanya menggunakan pelampung.
sumber
df = df.astype(pd.Int32Dtype())
(untuk mengonversi seluruh dataFrame, atau)df['col'] = df['col'].astype(pd.Int32Dtype())
. Jenis integer nullable yang diterima lainnya adalahpd.Int16Dtype
danpd.Int64Dtype
. Pilih racunmu.Dalam versi 0.24. + Panda telah memperoleh kemampuan untuk menahan dtypes integer dengan nilai yang hilang.
Tipe Data Integer Nullable .
Panda dapat mewakili data integer dengan nilai yang kemungkinan hilang
arrays.IntegerArray
. Ini adalah jenis ekstensi yang diterapkan dalam panda. Ini bukan tipe default untuk bilangan bulat, dan tidak akan disimpulkan; Anda harus secara eksplisit memasukkan dtype kearray()
atauSeries
:Untuk kolom konversi ke bilangan bulat nullable gunakan:
sumber
"Int64"
dan tidak"int64"
(pertama 'saya' harus dikapitalisasi)df.myCol = df.myCol.astype('Int64')
ataudf['myCol'] = df['myCol'].astype('Int64')
Kasing penggunaan saya adalah munging data sebelum memuat ke tabel DB:
Hapus NaN, konversikan ke int, konversikan ke str, lalu masukkan kembali NAN.
Itu tidak cantik tapi itu menyelesaikan pekerjaan!
sumber
Sekarang dimungkinkan untuk membuat kolom panda yang berisi NaN sebagai dtype
int
, karena sekarang secara resmi ditambahkan pada panda 0.24.0panda 0.24.x catatan rilis Quote: " Pandas telah memperoleh kemampuan untuk memegang dtypes integer dengan nilai yang hilang
sumber
Jika Anda benar-benar ingin menggabungkan bilangan bulat dan NaN dalam kolom, Anda dapat menggunakan tipe data 'objek':
Ini akan menggantikan NaN dengan integer (tidak peduli yang mana), konversikan ke int, konversikan ke objek dan akhirnya masukkan kembali NaNs.
sumber
Jika Anda dapat mengubah data yang disimpan, gunakan nilai sentinel untuk hilang
id
. Kasus penggunaan umum, disimpulkan dengan nama kolom,id
adalah integer, lebih besar dari nol, Anda dapat menggunakan0
sebagai nilai sentinel sehingga Anda dapat menulissumber
Anda bisa menggunakan
.dropna()
jika OK untuk menjatuhkan baris dengan nilai NaN.Atau, gunakan
.fillna()
dan.astype()
untuk menggantikan NaN dengan nilai-nilai dan mengubahnya menjadi int.Saya mengalami masalah ini saat memproses file CSV dengan integer besar, sementara beberapa di antaranya hilang (NaN). Menggunakan float sebagai tipenya bukan pilihan, karena saya mungkin kehilangan presisi.
Solusi saya adalah menggunakan str sebagai tipe perantara . Kemudian Anda dapat mengonversi string menjadi int sesuka Anda dalam kode. Saya mengganti NaN dengan 0, tetapi Anda dapat memilih nilai apa pun.
Sebagai ilustrasi, berikut adalah contoh bagaimana pelampung bisa kehilangan presisi:
Dan hasilnya adalah:
sumber
Sebagian besar solusi di sini memberi tahu Anda cara menggunakan integer placeholder untuk mewakili nol. Pendekatan itu tidak membantu jika Anda ragu integer tidak akan muncul di data sumber Anda. Metode saya dengan format Will mengapung tanpa nilai desimalnya dan mengonversi nol menjadi Tidak ada. Hasilnya adalah tipe data objek yang akan terlihat seperti bidang bilangan bulat dengan nilai nol saat dimuat ke CSV.
sumber
Saya mengalami masalah ini bekerja dengan pyspark. Karena ini adalah frontend python untuk kode yang berjalan pada jvm, ini memerlukan keamanan jenis dan menggunakan float bukan int bukan pilihan. Saya mengatasi masalah ini dengan membungkus panda
pd.read_csv
dalam fungsi yang akan mengisi kolom yang ditentukan pengguna dengan nilai isian yang ditentukan pengguna sebelum melemparkannya ke jenis yang diperlukan. Inilah yang akhirnya saya gunakan:sumber
sumber
edit
menambahkan info tambahan & / atau untuk melengkapi penjelasan Anda dengan dokumentasi sumber.Pertama-tama hapus baris yang mengandung NaN. Kemudian lakukan konversi Integer pada baris yang tersisa. Terakhir masukkan baris yang dihapus lagi. Semoga ini berhasil
sumber
Dengan asumsi DateColumn Anda diformat 3312018.0 harus dikonversi ke 03/31/2018 sebagai string. Dan, beberapa catatan hilang atau 0.
sumber