Machine Morning

機械学習やWebについて学んだことを記録しています。

Pythonで欠損値を扱う。

Pythonで欠損値を扱う際、主にNone (Null), NaN(Not a Number)を扱うことになる。今回はこれらの違いについて説明する。

None (Null)

NonePythonに標準で備わっているシングルトンオブジェクトである。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のときはもちろんNaNfloat64、文字列などのデータが入ったobject型の列ではfloat型となる。 ちなみにpandasで欠損値NaNの判定をするためにはisnull()を使う。numpyにはisnan()があるが、一般的にpandasではisnull()を使う。 Noneobject型の列でしか使えないため、結論としては欠損値としては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

参考

Handling Missing Data | Python Data Science Handbook