Saya mencoba untuk menulis dataframe Pandas (atau dapat menggunakan array numpy) ke database mysql menggunakan MysqlDB. MysqlDB sepertinya tidak mengerti 'nan' dan database saya mengeluarkan kesalahan yang mengatakan nan tidak ada dalam daftar lapangan. Saya perlu menemukan cara untuk mengubah 'nan' menjadi NoneType.
Ada ide?
python
pandas
numpy
mysql-python
Resi
sumber
sumber
None
untukNULL
bukannan
?Jawaban:
@bogatron benar, Anda dapat menggunakan
where
, perlu dicatat bahwa Anda dapat melakukan ini secara native di panda:Catatan: ini mengubah tipe d semua kolom menjadi
object
.Contoh:
Catatan: apa yang tidak dapat Anda lakukan menyusun ulang DataFrames
dtype
untuk mengizinkan semua tipe tipe data, menggunakanastype
, dan kemudianfillna
metode DataFrame :Sayangnya ini, maupun penggunaan
replace
, tidak berfungsi denganNone
melihat masalah (tertutup) ini .Selain itu, perlu dicatat bahwa untuk sebagian besar kasus penggunaan Anda tidak perlu mengganti NaN dengan None, lihat pertanyaan tentang ini perbedaan antara NaN dan None pada panda ini .
Namun, dalam kasus khusus ini tampaknya Anda melakukannya (setidaknya pada saat jawaban ini).
sumber
np.nan
konversi ke string"nan"
dtype
dariobject
dan melakukannya untuk mereka dan menangani jenis lain berbeda sesuai kebutuhan. Idealnya,fillna(None)
akan menjadi hebat.Penghargaan diberikan kepada orang ini di sini dalam masalah Github ini .
sumber
df.replace({np.nan: None})
sebagai objek temporerAnda dapat mengganti
nan
denganNone
di numpy array:sumber
dtype
,x.dtype
isdtype('float64')
, whiley.dtype
isdtype('object')
.Setelah tersandung, ini berhasil untuk saya:
sumber
Sekadar tambahan dari jawaban @Andy Hayden:
Karena
DataFrame.mask
merupakan kembaran kebalikan dariDataFrame.where
, mereka memiliki tanda tangan yang persis sama tetapi dengan arti yang berlawanan:DataFrame.where
berguna untuk Mengganti nilai yang kondisinya False .DataFrame.mask
digunakan untuk Mengganti nilai di mana kondisinya Benar .Jadi dalam pertanyaan ini, penggunaan
df.mask(df.isna(), other=None, inplace=True)
mungkin lebih intuitif.sumber
Tambahan lainnya: hati-hati saat mengganti kelipatan dan mengubah tipe kolom kembali dari objek menjadi float . Jika Anda ingin memastikan bahwa Anda
None
tidak akan membaliknp.NaN
saran terapkan @ andy-hayden dengan menggunakanpd.where
. Ilustrasi bagaimana penggantian masih bisa 'salah':sumber
.replace({np.nan: None})
replace({np.nan: None})
. Komentar saya ditambahkan untuk menunjukkan potensi jebakan saat menggantinp.nan
. Hal di atas pasti membuat saya tersandung sedikit!Cukup tua, namun saya menemukan masalah yang sama. Coba lakukan ini:
sumber