Numpy isnan () gagal pada array float (dari pandas dataframe berlaku)

104

Saya memiliki array float (beberapa angka normal, beberapa nans) yang keluar dari aplikasi pada pandas dataframe.

Untuk beberapa alasan, numpy.isnan gagal pada array ini, namun seperti yang ditunjukkan di bawah ini, setiap elemen adalah float, numpy.isnan berjalan dengan benar pada setiap elemen, jenis variabelnya pasti array numpy.

Apa yang sedang terjadi?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray
tim654321
sumber

Jawaban:

166

np.isnan dapat diterapkan ke array NumPy dari dtype asli (seperti np.float64):

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

tetapi memunculkan TypeError saat diterapkan ke array objek:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Karena Anda memiliki Pandas, Anda dapat menggunakannya pd.isnull- ia dapat menerima array NumPy dari objek atau dtypes asli:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

Catatan itu Nonejuga dianggap sebagai nilai null dalam array objek.

unutbu
sumber
3
Terima kasih - digunakan pd.isnull (). Tampaknya juga tidak berdampak pada kinerja.
tim654321
12

Pengganti yang bagus untuk np.isnan () dan pd.isnull () adalah

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

karena hanya nan tidak sama dengan dirinya sendiri.

Statham
sumber
yang mungkin tidak berfungsi untuk larik karena memunculkan "ValueError: Nilai kebenaran xxx yang ambigu".
MSeifert
@ MSeifert Apakah Anda berbicara tentang python ? Saya hanya menggunakan metode ini untuk melakukan sesuatu dalam pembelajaran mesin, Mengapa saya tidak menemukan kesalahan yang terkenal?
Statham
Ya, sepertinya Anda belum pernah menggunakan numpy atau panda sebelumnya. Cukup gunakan import numpy as np; a = np.array([1,2,3, np.nan])dan jalankan kode Anda.
MSeifert
@MSeifert er, saya baru mengenal numpy tetapi kodenya berjalan dengan baik, tidak ada kesalahan yang terjadi
Statham
Dalam [1]: impor numpy sebagai np Dalam [2]: a = np.array ([1,2,3, np.nan]) Dalam [3]: cetak [1. 2. 3. nan] Dalam [ 4]: cetak [3] == a [3] Salah
Statham
10

Di atas jawaban @unutbu, Anda bisa memaksa larik objek numpy panda ke tipe asli (float64), sesuatu di sepanjang garis

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

Tentukan error = 'coerce' untuk memaksa string yang tidak dapat diurai menjadi nilai numerik menjadi NaN. Jenis kolom akan menjadi dtype: float64, dan kemudian isnanpemeriksaan harus berfungsi

Severin Pappadeux
sumber
Namanya tampaknya unutbu;)
Dr_Zaszuś
@ Dr_Zaszuś Terima kasih, diperbaiki
Severin Pappadeux
1

Pastikan Anda mengimpor file csv menggunakan Pandas

import pandas as pd

condition = pd.isnull(data[i][j])
Dariswan Janweri P.
sumber