NumpyとPandasでNaNの判定、削除、置換のやり方を解説

スポンサーリンク

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を無視して数学演算を行うメソッドが用意されているのはありがたい。

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となります。

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)

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')

結果は以下の通りです。

Np Nan
Np Nan

また、列単位で値を記載することもできます。

つまり、ある列以下のNaNはすべて同じ値で置き換えられることになります。

Dataframe
Dataframe

結果は以下の通りです。

出力:

Isnull
Isnull

また、データフレーム内の欠損値を埋めるために補間を使用することもできます。

補間は、.fillna()と比較して、少し高度な方法です。

補間は、2つの既知のデータポイントの間で未知のデータポイントを推定するためのテクニックです。

3. NaN 値を含む行を削除する

NaNを含む行や列を削除するには、.dropna()メソッドを使用することができます

NaNを含む行を削除するには、次のようにします。

Fillna0
Fillna(0)

NaNを含む列を削除するには、:

Fillna Column

まとめ

今回のチュートリアルは、PythonのNaNについてでした。

主にNumpyとPandasでNaNを処理することに焦点を当てました。

楽しく学んでいただければ幸いです。

タイトルとURLをコピーしました