NumPyで欠損値np.nanを含む配列ndarrayの合計や平均を算出

Modified: | Tags: Python, NumPy

NumPy配列ndarrayに一つでも欠損値np.nanが含まれている場合、通常のnp.sum()などの関数・メソッドを使うとnp.nanが返される。np.nansum()などの関数を用いることで欠損値np.nanを除外した要素に対する演算が可能。

PythonにおけるNaNの扱いについての基本は以下の記事を参照。

欠損値np.nanを含む配列ndarrayについて、np.nanを置き換えたり、np.nanが含まれる行や列を削除したりする方法については以下の記事を参照。

本記事のサンプルコードのNumPyのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。例として、データが欠落したCSVファイルをnp.genfromtxt()で読み込んで使う。欠落箇所が欠損値np.nanとなる。

import numpy as np

print(np.__version__)
# 1.26.1

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(a)
# [[11. 12. nan 14.]
#  [21. nan nan 24.]
#  [31. 32. 33. 34.]]

欠損値np.nanを含むndarrayに対してはnp.nansum()を使う

対象のndarrayに一つでも欠損値np.nanが含まれている場合、NumPyの関数np.sum()ndarrayのメソッドsum()で合計を算出すると、np.nanが返される。

print(np.sum(a))
# nan

print(a.sum())
# nan

関数np.nansum()を使うと、欠損値np.nanを除外した要素の合計が算出される。

print(np.nansum(a))
# 212.0

sum()と同様に、引数axisを設定することで行ごと・列ごとの合計を算出することもできる。例は省略するが引数keepdimsも指定可能。

print(np.nansum(a, axis=0))
# [63. 44. 33. 72.]

print(np.nansum(a, axis=1))
# [ 37.  45. 130.]

ndarraynansum()メソッドは提供されていない。

平均や最大・最小なども同様(np.nanmean(), np.nanmax()など)

平均や最大・最小、標準偏差、分散などについても同様で、欠損値np.nanを除外した値を対象とする関数np.nanmean(), np.nanmax(), np.nanmin(), np.nanstd(), np.nanvar()が用意されている。

print(np.nanmean(a))
# 23.555555555555557

print(np.nanmax(a))
# 34.0

print(np.nanmin(a))
# 11.0

print(np.nanstd(a))
# 8.908312112367753

print(np.nanvar(a))
# 79.35802469135803

いずれの関数でも引数axiskeepdimsを指定可能。

関連カテゴリー

関連記事