NumPyで欠損値np.nanを含む配列ndarrayの合計や平均を算出
NumPy配列ndarrayに一つでも欠損値np.nanが含まれている場合、通常のnp.sum()などの関数・メソッドを使うとnp.nanが返される。np.nansum()などの関数を用いることで欠損値np.nanを除外した要素に対する演算が可能。
Pythonにおける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.]]
source: numpy_nansum.py
欠損値np.nanを含むndarrayに対してはnp.nansum()を使う
対象のndarrayに一つでも欠損値np.nanが含まれている場合、NumPyの関数np.sum()やndarrayのメソッドsum()で合計を算出すると、np.nanが返される。
print(np.sum(a))
# nan
print(a.sum())
# nan
source: numpy_nansum.py
関数np.nansum()を使うと、欠損値np.nanを除外した要素の合計が算出される。
print(np.nansum(a))
# 212.0
source: numpy_nansum.py
sum()と同様に、引数axisを設定することで行ごと・列ごとの合計を算出することもできる。例は省略するが引数keepdimsも指定可能。
print(np.nansum(a, axis=0))
# [63. 44. 33. 72.]
print(np.nansum(a, axis=1))
# [ 37. 45. 130.]
source: numpy_nansum.py
ndarrayのnansum()メソッドは提供されていない。
平均や最大・最小なども同様(np.nanmean(), np.nanmax()など)
平均や最大・最小、標準偏差、分散などについても同様で、欠損値np.nanを除外した値を対象とする関数np.nanmean(), np.nanmax(), np.nanmin(), np.nanstd(), np.nanvar()が用意されている。
- numpy.nanmean — NumPy v1.26 Manual
- numpy.nanmax — NumPy v1.26 Manual
- numpy.nanmin — NumPy v1.26 Manual
- numpy.nanstd — NumPy v1.26 Manual
- numpy.nanvar — NumPy v1.26 Manual
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
source: numpy_nansum.py
いずれの関数でも引数axisやkeepdimsを指定可能。