回答:
True
xがNaN(数値ではない)のFalse
場合はそれを返し、それ以外の場合は返します。
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
に好適np.isnan()
?
import numpy
約15 MBのRAMをimport math
numpy.isnan
NumPy配列を処理するため、NumPyを使用している場合は優れた選択肢です。NumPyを使用していない場合、NumPyの依存関係を取り、NaNチェックのためだけにNumPyをロードする時間を費やしてもメリットはありません(ただし、NaNチェックを実行する種類のコードを記述している場合は、 NumPy)。
NaNをテストする通常の方法は、それがそれ自体と等しいかどうかを確認することです。
def isNaN(num):
return num != num
numpy.isnan(number)
かどうかを教えてくれますNaN
。
numpy.all(numpy.isnan(data_list))
リスト内のすべての要素がナンであるかどうかを判断する必要がある場合にも役立ちます
all(map(math.isnan, [float("nan")]*5))
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
ps.isna()
私の問題を解決します。ありがとう!
ここで働く答えです:
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
numpy.nan
がfloat
返す種類と同じように、通常のPython オブジェクトfloat('nan')
です。NumPyで遭遇するほとんどのNaNはnumpy.nan
オブジェクトではありません。
numpy.nan
NaN値をCの基礎となるライブラリに独自に定義します。PythonのNaNはラップしません。しかし現在は、どちらもC99 APIに依存しているため、どちらもIEEE 754標準に準拠しています。
float('nan') is float('nan')
非一意)とnp.nan is np.nan
(一意)
np.nan
特定のオブジェクトですが、float('nan')
呼び出しごとに新しいオブジェクトが生成されます。あなたがしたなら、あなたもnan = float('nan')
得るでしょうnan is nan
。あなたが構築した場合、実際のようなものでnumpyのはNaNをnp.float64('nan')
、そしてあなたが取得したいnp.float64('nan') is not np.float64('nan')
、あまりにも。
私は実際にこれに遭遇しましたが、私にとっては、nan、-inf、またはinfのチェックでした。使ったばかり
if float('-inf') < float(num) < float('inf'):
これは数値の場合はtrue、nanの場合はfalse、両方の場合はfalseであり、文字列やその他の型(例外はあります)などの例外を発生させます。また、これには、mathやnumpyなどのライブラリをインポートする必要はありません(numpyは非常に大きいので、コンパイルされたアプリケーションのサイズが2倍になります)。
math.isfinite
それは「再発明ホイール[INGの]」正確ではなかったのPython 3.2になるまで、その2012年に投稿されました@DaveTheScientistから答えを与え導入されていなかった-解決策はまだPythonの2と、これらの作業の略
または、番号をそれ自体と比較します。NaNは常にある!=(それがあれば例えばNaNは、それ以外で数)の比較が成功しなければなりません。
関数にいくつか問題があったので、まあ私はこの投稿に入りました:
math.isnan()
このコードを実行すると問題が発生します。
a = "hello"
math.isnan(a)
例外が発生します。そのための私の解決策は、別のチェックを行うことです:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
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
try: int(value)
value
ものNaN
か?
NaN
います(Pythonのように、から取得できるものなどfloat('inf') * 0
)。したがって、文字列 'Hello'は数値ではありませんが、数値であるNaN
ためではありませんNaN
!
int(value)
すべての例外をチェックする必要はありませんFalse
。
変数が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
イテラブル内に型が混在している場合は、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
必要がないため、すぐに評価されるためです。
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')
それがそれ自身と等しいかどうかをチェックしているようです
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)
パンダの文字列の場合は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