Pythonで欠損値を扱う。
Pythonで欠損値を扱う際、主にNone (Null), NaN(Not a Number)を扱うことになる。今回はこれらの違いについて説明する。
None (Null)
None
はPythonに標準で備わっているシングルトンオブジェクトである。PythonではNullをNone
として扱い、None
のみがNone
である。False
のように0や空のリストがNone
になることはない。
ついでなのでどういったものがFalse
と判定されるのかリストアップしておく。
以下はNone
ではなくFalse
と判定されるものなので注意すること。
- False (boolean)
- None (null)
- 0 (int)
- 0.0 (float)
- "" (空のstring)
- [] (空のlist)
- () (空のtuple)
- {} (空のdictionary)
- set() (空のset)
- NaNを比較演算する
NaN (Not a Number)
PandasでDataFrameを作ると、ある要素が空の場合その要素は自動的にNaN
になる。
したがって、実際の分析ではpd.read_csv()
やpd.read_sql()
でデータを読み込んで、欠損値があった場合NaN
を扱うことになる。
DataFrameでNaN
になる場合、その列の型がfloat64
のときはもちろんNaN
もfloat64
、文字列などのデータが入ったobject
型の列ではfloat
型となる。
ちなみにpandasで欠損値NaN
の判定をするためにはisnull()
を使う。numpyにはisnan()
があるが、一般的にpandasではisnull()
を使う。
None
はobject
型の列でしか使えないため、結論としては欠損値としてはNaN
を使うとよい。というよりも自動的にNaN
になるか、そうでない場合は、replace("None", np.nan)
でNaN
に統一してしまった方が扱いが簡単である。
>>> np.nan == np.nan False >>> bool(np.nan) True >>> np.nan == True False >>> np.isnan(np.nan) True