web-dev-qa-db-ja.com

NaN値を確認する方法

float('nan')はNanになります(数字ではありません)。しかし、どうすれば確認できますか?非常に簡単なはずですが、私はそれを見つけることができません。

723
Jack Ha

math.isnan()

Float xがNaN(数値ではない)かどうかを調べます。 NaNはIEEE 754規格の一部です。 inf * 0、inf/inf、またはNaNを含む任意の演算、たとえばnan * 1、NaNを返します。

バージョン2.6の新機能。

>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>> 
944
gimel

NaNをテストする通常の方法は、それがそれ自身と等しいかどうかを確認することです。

def isNaN(num):
    return num != num
276

numpy.isnan(number)は、Python 2.5ではNaNかどうかを教えてくれます。

112
mavnn

私は実際にこれに遭遇しました、しかし私にとってそれはnan、-inf、またはinfをチェックしていました。私はちょうど使った

if float('-inf') < float(num) < float('inf'):

これは数値に当てはまり、nanとその両方に当てはまり、文字列や他の型のようなものには例外を発生させます(おそらく良いことでしょう)。また、これはmathやnumpyのようなライブラリをインポートする必要がありません(numpyはとても大きいので、コンパイルされたアプリケーションのサイズを2倍にします)。

24

これが次のものに対する回答です。

  • python 一意でない NaN:float('nan')
  • numpy 一意の NaN(シングルトン):np.nan
  • その他のオブジェクト:文字列またはその他(遭遇しても例外は発生しません)

ここにあります:

import numpy as np

def is_nan(x):
    return (x is np.nan or x != x)

そしていくつかの例:

values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print "{:<8} : {}".format(repr(value), is_nan(value))

出力:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
21
x0s

math.isnan()

または番号をそれ自体と比較してください。 NaNは常に!= NaNです。それ以外の場合(例:数値の場合)、比較は成功します。

20
Tomalak

あなたが2.6未満で立ち往生しているならば、もう一つの方法、あなたはぎこちなく持っていない、そしてあなたはIEEE 754サポートを持っていない:

def isNaN(x):
    return str(x) == str(1e400*0)
17
Josh Lee

私はこの記事に入りました、なぜなら私は関数にいくつかの問題があったからです:

math.isnan()

このコードを実行すると問題があります。

a = "hello"
math.isnan(a)

例外が発生します。そのための私の解決策は別のチェックをすることです:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)
10
Idok

2.6未満のpythonを使って

def isNaN(x):
    return str(float(x)).lower() == 'nan'

これは私にとってSolaris 5.9マシン上のpython 2.5.1とUbuntu 10上のpython 2.6.5で動作します。

8
Mauro Bianchi

変数をテストできる3つの方法は、 "NaN"かどうかです。

import pandas as pd
import numpy as np
import math

#For single variable all three libraries return single boolean
x1 = float("nan")

print(f"It's pd.isna  : {pd.isna(x1)}")
print(f"It's np.isnan  : {np.isnan(x1)}")
print(f"It's math.isnan : {math.isnan(x1)}")

出力

It's pd.isna  : True
It's np.isnan  : True
It's math.isnan  : True
7
M. Hamza Rajput

NaNを文字列'Nan'として送信するWebサービスからデータを受信して​​います。しかし、私のデータには他の種類の文字列もあるかもしれないので、単純なfloat(value)は例外を投げることができます。私は次のような一般的な回答を使用しました。

def isnan(value):
  try:
      import math
      return math.isnan(float(value))
  except:
      return False

要件:

isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
4
Mahdi

変数がNaNかNoneかを判断するためのすべてのメソッド:

なしタイプ

In [1]: from numpy import math

In [2]: a = None
In [3]: not a
Out[3]: True

In [4]: len(a or ()) == 0
Out[4]: True

In [5]: a == None
Out[5]: True

In [6]: a is None
Out[6]: True

In [7]: a != a
Out[7]: False

In [9]: math.isnan(a)
Traceback (most recent call last):
  File "<ipython-input-9-6d4d8c26d370>", line 1, in <module>
    math.isnan(a)
TypeError: a float is required

In [10]: len(a) == 0
Traceback (most recent call last):
  File "<ipython-input-10-65b72372873e>", line 1, in <module>
    len(a) == 0
TypeError: object of type 'NoneType' has no len()

NaN型

In [11]: b = float('nan')
In [12]: b
Out[12]: nan

In [13]: not b
Out[13]: False

In [14]: b != b
Out[14]: True

In [15]: math.isnan(b)
Out[15]: True
3
siberiawolf61

混合データ型のリストからNaN(float)項目を削除する方法

イテラブルに複数の型が混在している場合は、numpyを使用しない方法があります。

from math import isnan

Z = ['a','b', float('NaN'), 'd', float('1.1024')]

[x for x in Z if not (
                      type(x) == float # let's drop all float values…
                      and isnan(x) # … but only if they are nan
                      )]
['a'、 'b'、 'd'、1.1024]

ショートサーキット評価とは、 'float'型ではない値に対して(False and …が右辺を評価せずにすぐにisnanに評価されるので、Falseは呼び出されないことを意味します。

1
sleblanc

Float型のnan用

>>> import pandas as pd
>>> value = float(nan)
>>> type(value)
>>> <class 'float'>
>>> pd.isnull(value)
True
>>>
>>> value = 'nan'
>>> type(value)
>>> <class 'str'>
>>> pd.isnull(value)
False
0
Justin