Pythonで欠損値を扱う際に、Noneとnumpy.nanを混同すると欠損判定で思いがけないミスを起こしかねません。
今回はNoneとnumpy.nanの挙動の違いをまとめてみます。
定義
None
Python公式ドキュメント
None
is the sole instance of theNoneType
type.
NoneはNoneType型の唯一の値です。値が存在しないことを示す定数です。
numpy.nan
IEEE 754 floating point representation of Not a Number (NaN).
Scipy公式ドキュメント
numpy.nanは浮動小数点数のfloat型における非数を表す値です。Numpyはもちろん、Pandasで欠損を含むCSVファイルなどを読み込むと、このnanが出てきます。
nanとはNot a Numberの頭文字で、未定義な値か、浮動小数点数における計算結果で表すことができない値のことを言います。表すことができない数値とは、例えば無限、0除算の結果などです。
データの生成
Noneとnumpy.nanのデータを生成してみます。
import numpy as np
val_None = None
val_npNan = np.nan
type(val_None)
>> <class 'NoneType'>
type(val_npNan)
>> <class 'float'>
型を確認すると、定義どおりNoneはNoneType型、numpy.nanはfloat型です。
Noneの判定
Noneかどうかを判定する場合は、is Noneで判定します。
val_None is None
>> True
val_npNan is None
>> False
この判定の場合、numpy.nanはFalseが返されます。
numpy.nanの判定
numpy.nanの判定にはnumpy.isnan()を使います。
np.isnan(val_npNan)
>> True
np.isnan(val_None)
>>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''
numpy.isnan()にNoneを渡すとエラーになります。これはnumpy.isnan()が数値型データのインプットを予想しているのに対し、Noneが数値型でないためです。
【参考】自身を比較したときの挙動
Noneとnumpy.nanでは自分自身を比較したときの挙動も異なります。
val_None == val_None
>> True
val_npNan == val_npNan
>> False
numpy.nanの場合、自身を比較するとFalseが返されます。これはPythonにおけるnanの重要な性質なので、確認しておいてください。
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
初学者の方にはこちらもオススメです^^
まとめ
PythonにおけるNoneとnumpy.nanの違いを確認しました。
こうしてみるとNoneとnumpy.nanは別物なのですが、両者とも「欠損値」として認知されている故混同されがちだと思います。
特に欠損判定する際には注意してください。
ではでは👋