NaNはNot a numberの略です。
未定義の項目を表すのに使われる。
また、データセット内の欠損値を表すのにも使われる。
NaNという概念は、Pythonが生まれる以前から存在していた。
IEEE Standard for Floating-Point Arithmetic (IEEE 754)は1985年にNaNを導入した。
NaN は特殊な浮動小数点値で、float 以外の型に変換することができません。
この記事では、PandasとNumpyでNaNがどのように動作するかを見ていきます。
NumpyのNaN
NumpyでNaNがどのように動作するかを見てみましょう。
NaNの特性を見るために、Numpyの配列にNaN値を作ってみましょう。
import numpy as np
arr = np.array([ 1 , np.nan, 3 , 4 , 5 , 6 , np.nan])
pritn(arr) |
結果は以下の通りです。
[ 1. nan 3. 4. 5. 6. nan] |
1. NaNを含むNumpy配列に対する数学的演算
Numpyの配列に対して、基本的な関数を呼び出してみましょう。
print (arr. sum ())
|
結果は以下の通りです。
nan |
配列から最大値を求めてみましょう。
print (arr. max ())
|
結果は以下の通りです。
nan |
NumpyにはNaNを無視して数学演算を行うメソッドが用意されているのはありがたい。
この記事もチェック:Numpyのブール配列の作成、演算、インデックス等を解説する
2. Numpyの配列でNaN値を無視して数学演算を行う方法
Numpyにはnp.nansum()やnp.nanmax()といったメソッドがあり、配列のNaN値を無視してsumやmaxを計算することができます。
np.nansum(arr) |
結果は以下の通りです。
19.0 |
np.nanmax(arr) |
6.0 |
IDEでオートコンプリートをオンにしている場合、np.nanを操作しているときに以下のオプションのリストが表示されます。
np.isnan(arr) |
3. NaN値のチェック
Numpy配列のNaN値をチェックするには、np.isan()メソッドを使用することができます。
これは、元の配列のサイズと同じ大きさのブール値のマスクを出力します。
[False True False False False False True] |
結果は以下の通りです。
出力:
a = np.nan
b = np.nan
|
出力される配列は、元の配列のNaNであるインデックスがtrue、それ以外がfalseとなります。
この記事もチェック:Numpyとvstackメソッドを使って1次元配列を多次元配列に結合する方法
4. 2つのNANの等価性
2つのNaNは互いに等しいか?
これは紛らわしい質問かもしれません。
いくつかのpythonのコードを実行することによって、それに答えてみましょう。
a = = b
|
これらの2つの文は、2つの変数、aとbをnanで初期化します。
この2つを等しくしてみましょう。
False |
結果は以下の通りです。
a is b
|
Pythonには、is演算子もあります。
それを使って、2つの変数を比較してみましょう。
True |
結果は以下の通りです。
id (a)
|
この理由は、== 演算子はオペランドの両方の値を比較して、値が等しいかどうかをチェックするからです。
一方、is 演算子
は、オペランドが両方とも同じオブジェクトを参照しているかどうかをチェックします。
実際、aとbの両方のIDをプリントアウトして、それらが同じオブジェクトを参照していることを確認することができます。
139836725842784 |
結果は以下の通りです。
id (b)
|
139836725842784 |
結果は以下の通りです。
s = pd.DataFrame([( 0.0 , np.nan, - 2.0 , 2.0 ),
... (np.nan, 2.0 , np.nan, 1 ),
... ( 2.0 , 5.0 , np.nan, 9.0 ),
... (np.nan, 4.0 , - 3.0 , 16.0 )],
... columns = list ( 'abcd' ))
s |
Pandas データフレームの NaN
Pandas DataFrameはpythonにデータをインポートする一般的な方法です。
Pandas DataframeでNaN値をどのように扱うことができるか見てみましょう。
まず、データフレームを作成することから始めましょう。
s.isnull() |
結果は以下の通りです。
s.fillna( 0 )
|
この記事もチェック:Pandasのデータフレームに行を追加する5つの簡単な方法
1. NaN 値のチェック
isnull() メソッドを使用すると、NaN 値をチェックすることができます。
出力は、元のデータフレームと同じ次元のブール型マスクになります。
values = { 'a' : 0 , 'b' : 1 , 'c' : 2 , 'd' : 3 }
s.fillna(value = values)
|
結果は以下の通りです。
df.dropna() |
2. NaN 値の置換
Pandas DataframeのNaN値を置き換えるには複数の方法があります。
最も一般的な方法は、.fillna()メソッドを使用する方法です。
このメソッドでは、NaNを置換する値を指定する必要があります。
df.dropna(axis = 'columns' )
|
結果は以下の通りです。
また、列単位で値を記載することもできます。
つまり、ある列以下のNaNはすべて同じ値で置き換えられることになります。
結果は以下の通りです。
出力:
また、データフレーム内の欠損値を埋めるために補間を使用することもできます。
補間は、.fillna()と比較して、少し高度な方法です。
補間は、2つの既知のデータポイントの間で未知のデータポイントを推定するためのテクニックです。
この記事もチェック:Pandas fillna() メソッド – 完全ガイド
3. NaN 値を含む行を削除する
NaNを含む行や列を削除するには、.dropna()メソッドを使用することができます。
NaNを含む行を削除するには、次のようにします。
NaNを含む列を削除するには、:
まとめ
今回のチュートリアルは、PythonのNaNについてでした。
主にNumpyとPandasでNaNを処理することに焦点を当てました。
楽しく学んでいただければ幸いです。