NaN値を確認するにはどうすればよいですか?


回答:


1280

math.isnan(x)

TruexがNaN(数値ではない)のFalse場合はそれを返し、それ以外の場合は返します。

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

5
@ charlie-parker:Python3では、math.isnanはまだ数学モジュールの一部です。docs.python.org/3/library/math.html#math.isnan。必要に応じてnumpy.isnanを使用してください。この回答は単なる提案です。
ギメル

2
シッティング・ブルを参照してください@ docs.python.org/3/library/functions.html#float「引数が文字列であれば、それは小数点数を含める必要があります」、または「インフィニティ」「INF」「ナン」
ギメル

35
されmath.isnanに好適np.isnan()
TMWP 2017

34
@TMWPはおそらく... import numpy約15 MBのRAMをimport math
消費し

9
@TMWP:numpy.isnanNumPy配列を処理するため、NumPyを使用している場合は優れた選択肢です。NumPyを使用していない場合、NumPyの依存関係を取り、NaNチェックのためだけにNumPyをロードする時間を費やしてもメリットはありません(ただし、NaNチェックを実行する種類のコードを記述している場合、 NumPy)。
user2357112は

359

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

def isNaN(num):
    return num != num

8
警告の言葉:クマのコメントを引用して「Python <= 2.5で立ち往生している人のために。Nan!= Nanは確実に動作しませんでした。代わりにnumpyを使用しました。」そうは言っても、実際に失敗することはありません。
mavnn

22
演算子のオーバーロードを考えると、この関数を混乱させる方法はたくさんあると思います。math.isnan()で行く
djsadinoff

4
上記の754仕様では、NaN == NaNは常にfalseである必要がありますが、常にそうであるとは限りません。とにかくこれは数学や派手な方法でこれを内部でチェックする方法ではないでしょうか?
Hari Ganesan 2014

感謝します。これは15-20x倍高速スカラで操作を行う場合np.isnanを使用するよりもです
thomas.mac

5
これは機能し、ある程度の意味がありますが、私は原則を持つ人間であり、ここでは禁止された魔術としてこれを宣言します。代わりにmath.isnanを使用してください。
ゴンザロ

152

numpy.isnan(number)かどうかを教えてくれますNaN


3
Pythonバージョン2.7でも動作します。
ミシェルケイツァー

6
numpy.all(numpy.isnan(data_list))リスト内のすべての要素がナンであるかどうかを判断する必要がある場合にも役立ちます
Jay P.

3
NumPyは必要ありません:all(map(math.isnan, [float("nan")]*5))
sleblanc 2015年

6
この回答が6年前に書かれたとき、Python 2.5はまだ一般的に使用されていました-math.isnanは標準ライブラリの一部ではありませんでした。今では、多くの場所でそうならないことを本当に望んでいます!
mavnn 2015年

4
np.isnan()は、decimal.Decimal型(多くのnumpyの関数)を処理しないことに注意してください。math.isnan()は処理します。
2018年

55

変数が「NaN」かどうかをテストできる3つの方法を次に示します。

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

2
pd.isna(value)は多くの問題を解決しました!魅力のように働いています!
abhishake

1
ps.isna()私の問題を解決します。ありがとう!
darthbhyrava

32

ここで働く答えです:

  • IEEE 754標準に準拠したNaN実装
    • つまり:pythonのNaN:float('nan')numpy.nan...
  • その他のオブジェクト:文字列など(発生しても例外は発生しません)

標準に従って実装されたNaNは、それ自体との不等比較がTrueを返す必要がある唯一の値です。

def is_nan(x):
    return (x != x)

そしていくつかの例:

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

出力:

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

1
私がチェックしているシリーズは、欠損値のある文字列が「nans」(???)であるため、このソリューションは他のソリューションが失敗した場所で機能します。
keithpjolley

numpy.nanfloat返す種類と同じように、通常のPython オブジェクトfloat('nan')です。NumPyで遭遇するほとんどのNaNはnumpy.nanオブジェクトではありません。
user2357112はモニカ

numpy.nanNaN値をCの基礎となるライブラリに独自に定義します。PythonのNaNはラップしません。しかし現在は、どちらもC99 APIに依存しているため、どちらもIEEE 754標準に準拠しています。
x0s

@ user2357112supportsMonica:Pythonとnumpy NaNは実際には同じように動作しません:(float('nan') is float('nan')非一意)とnp.nan is np.nan(一意)
x0s

@ x0s:NumPyとは関係ありません。np.nan特定のオブジェクトですが、float('nan')呼び出しごとに新しいオブジェクトが生成されます。あなたがしたなら、あなたもnan = float('nan')得るでしょうnan is nan。あなたが構築した場合、実際のようなものでnumpyのはNaNをnp.float64('nan')、そしてあなたが取得したいnp.float64('nan') is not np.float64('nan')、あまりにも
user2357112はモニカ

28

私は実際にこれに遭遇しましたが、私にとっては、nan、-inf、またはinfのチェックでした。使ったばかり

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

これは数値の場合はtrue、nanの場合はfalse、両方の場合はfalseであり、文字列やその他の型(例外はあります)などの例外を発生させます。また、これには、mathやnumpyなどのライブラリをインポートする必要はありません(numpyは非常に大きいので、コンパイルされたアプリケーションのサイズが2倍になります)。


9
math.isfiniteそれは「再発明ホイール[INGの]」正確ではなかったのPython 3.2になるまで、その2012年に投稿されました@DaveTheScientistから答えを与え導入されていなかった-解決策はまだPythonの2と、これらの作業の略
sudo_coffee

22

math.isnan()

または、番号をそれ自体と比較します。NaNは常にある!=(それがあれば例えばNaNは、それ以外数)の比較が成功しなければなりません。


6
Python <= 2.5にこだわっている人向け。ナン!=ナンは確実に機能しませんでした。代わりにnumpyを使用しました。
クマ

16

<2.6で立ち往生している場合のもう1つの方法は、numpyがなく、IEEE 754がサポートされていない場合です。

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

12

関数にいくつか問題があったので、まあ私はこの投稿に入りました:

math.isnan()

このコードを実行すると問題が発生します。

a = "hello"
math.isnan(a)

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

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

3
isnan()は文字列ではなく浮動小数点数を取るため、おそらく反対票が投じられました。関数には何の問題もありません、そして問題は彼がそれを使用しようとしたことだけです。(その特定のユースケースでは、彼のソリューションは有効ですが、この質問に対する回答ではありません。)
Peter Hansen

6
この方法で型のチェックに注意してください。これは、たとえばnumpy.float32 NaNに対しては機能しません。try / except構文を使用することをお勧めします: def is_nan(x): try: return math.isnan(x) except: return False
Rob

3
NaNは、値が有効な数値ではないことを意味しませ。これは、特定の結果が未定義であることを指定するためのIEEE浮動小数点表現の一部です。例:0 /0。したがって、「hello」がナンであるかどうかを尋ねることは意味がありません。
Brice M. Dempsey

2
NaNは文字列、int、floatの任意のリストに着陸できるため、これはより良い方法です。とても便利なチェック
RAFIQ

パンダで文字列列を処理するには、これを正確に実装する必要がありました。
クリスチャンガルシア

7

Python <2.6で私は結局

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

これは、Solaris 5.9ボックスでpython 2.5.1を使用し、Ubuntu 10でpython 2.6.5を使用して動作します。


6
Windowsは時々これを呼び出すので、これはあまりポータブルではありません-1.#IND
Mike T

5

NaN文字列として送信するWebサービスからデータを受信しています'Nan'。しかし、私のデータには他の種類の文字列も含まれる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

1
またはtry: int(value)
2016

@chwiので、あなたの提案は、について何を教えてくれないvalueものNaNか?
Mahdi

さて、「数ではない」ので、intにキャストできないものは実際には数ではないので、tryステートメントは失敗しますか?試行して、trueを返します。ただしfalseを返します。
chwi 2016

@chwiまあ、文字通り「数字ではない」をとるのは正しいですが、それはここでは重要ではありません。実際、私はのセマンティクスが何であるかを正確に探してNaNいます(Pythonのように、から取得できるものなどfloat('inf') * 0)。したがって、文字列 'Hello'は数値ではありませんが、数値であるNaNためではありませんNaN
Mahdi

@chwi:例外処理が特定の例外に対するものであれば、あなたは正しいです。しかし、この回答では、一般的な例外が処理されています。ですから、int(value)すべての例外をチェックする必要はありませんFalse
Harsha Biyani

3

変数が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

2

混合データ型のリストから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]

短絡評価とは、isnan「float」型ではない値に対しては呼び出されないことを意味します。これは、右側をFalse and (…)評価するFalse必要がないため、すぐに評価されるためです。


1

Python 3.6では、文字列値x math.isnan(x)とnp.isnan(x)をチェックするとエラーが発生します。そのため、与えられた値がNaNであるかどうか、事前に数値であることがわからない場合は確認できません。以下はこの問題を解決するようです

if str(x)=='nan' and type(x)!='str':
    print ('NaN')
else:
    print ('non NaN')

1

それがそれ自身と等しいかどうかをチェックしているようです

x!=x

最速です。

import pandas as pd 
import numpy as np 
import math 

x = float('nan')

%timeit x!=x                                                                                                                                                                                                                        
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit math.isnan(x)                                                                                                                                                                                                               
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit pd.isna(x) 
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.isnan(x)                                                                                                                                                                                                                 
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

0

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

-5

パンダの文字列の場合はpd.isnullを取ります:

if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):

NLTKの特徴抽出としての機能

def act_features(atext):
features = {}
if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):
    if word not in default_stopwords:
      features['cont({})'.format(word.lower())]=True
return features

この削減はどうですか?
Max Kleiner

isnullは、NaN値だけでなくtrueを返します。
ボリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.