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
を指定可能。