【Python】Noneとnumpy.nanの違いを把握する

Pythonで欠損値を扱う際に、Noneとnumpy.nanを混同すると欠損判定で思いがけないミスを起こしかねません。

今回はNoneとnumpy.nanの挙動の違いをまとめてみます。

定義

None

None is the sole instance of the NoneType type.

Python公式ドキュメント

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は別物なのですが、両者とも「欠損値」として認知されている故混同されがちだと思います。

特に欠損判定する際には注意してください。

ではでは👋