note.nkmk.me

pandasで欠損値NaNが含まれているか判定、個数をカウント

Date: 2018-05-20 / tags: Python, pandas

pandas.DataFrame, pandas.Seriesに欠損値NaNが含まれているどうかを判定する方法、および、欠損値NaNの個数をカウントする方法を説明する。

例として空白を含むcsvファイルをread_csvで読み込んで使用する。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')
print(df)
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1      NaN   NaN   NaN    NaN    NaN
# 2  Charlie   NaN    CA    NaN    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen   NaN    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

サンプルのcsvファイルはコチラ。

ここでは以下の内容について説明する。

  • isnull()で要素ごとに欠損値か判定
  • 行・列ごとにすべての要素が欠損値か判定
  • 行・列ごとに欠損値をひとつでも含むか判定
  • 行・列ごとに欠損値の個数をカウント
  • 行・列ごとに欠損値でない要素の個数をカウント
  • 欠損値の総数をカウント
  • 欠損値でない要素の総数をカウント
  • 全体に欠損値が含まれているかを判定
  • pandas.Seriesの場合

欠損値NaNを削除したり置換したりする方法、欠損値NaNに限らず特定の条件を満たす要素の数をカウントする方法については以下の記事を参照。

スポンサーリンク

isnull()で要素ごとに欠損値か判定

pandas.DataFrameおよびpandas.Seriesにはisnull()メソッドが用意されている。

各要素に対して判定を行い、欠損値NaNであればTrue、欠損値でなければFalseとする。元のオブジェクトと同じサイズ(行数・列数)のオブジェクトを返す。

print(df.isnull())
#     name    age  state  point  other
# 0  False  False  False   True   True
# 1   True   True   True   True   True
# 2  False   True  False   True   True
# 3  False  False  False  False   True
# 4  False   True  False  False   True
# 5  False  False   True   True   True

このisnull()で得られるbool値を要素とするオブジェクトを使って、行・列ごとの欠損値の判定やカウントを行う。

pandas.Seriesについては最後に述べる。

行・列ごとにすべての要素が欠損値か判定

all()は行・列ごとにすべての要素がTrueであればTrueと判定するメソッド。pandas.DataFrameから呼ぶとpandas.Seriesを返す。

all()isnull()の結果に対して適用することで、行・列ごとにすべての要素が欠損値NaNか判定できる。

デフォルトでは列に対して処理される。

print(df.isnull().all())
# name     False
# age      False
# state    False
# point    False
# other     True
# dtype: bool

引数axis=1とすると行に対して処理される。

print(df.isnull().all(axis=1))
# 0    False
# 1     True
# 2    False
# 3    False
# 4    False
# 5    False
# dtype: bool

行・列ごとに欠損値をひとつでも含むか判定

any()は行・列ごとにTrueがひとつでもあればTrueと判定するメソッド。pandas.DataFrameから呼ぶとpandas.Seriesを返す。

any()isnull()の結果に対して適用することで、行・列ごとに欠損値NaNをひとつでも含むか判定できる。

デフォルトでは列に対して処理される。

print(df.isnull().any())
# name     True
# age      True
# state    True
# point    True
# other    True
# dtype: bool

引数axis=1とすると行に対して処理される。

print(df.isnull().any(axis=1))
# 0    True
# 1    True
# 2    True
# 3    True
# 4    True
# 5    True
# dtype: bool

行・列ごとに欠損値の個数をカウント

sum()は行・列ごとに合計を算出するメソッド。pandas.DataFrameから呼ぶとpandas.Seriesを返す。

sum()ではTrue=1, False=0として処理されるため、sum()isnull()の結果に対して適用することで、行・列ごとに欠損値NaNの個数をカウントできる。

デフォルトでは列に対して処理される。

print(df.isnull().sum())
# name     1
# age      3
# state    2
# point    4
# other    6
# dtype: int64

引数axis=1とすると行に対して処理される。

print(df.isnull().sum(axis=1))
# 0    2
# 1    5
# 2    3
# 3    1
# 4    2
# 5    3
# dtype: int64

行・列ごとに欠損値でない要素の個数をカウント

count()は行・列ごとに欠損値NaNでない要素の個数をカウントするメソッド。pandas.DataFrameから呼ぶとpandas.Seriesを返す。

isnull()の結果ではなく、元のpandas.DataFrameから直接呼べばOK。

デフォルトでは列に対して処理される。

print(df.count())
# name     5
# age      3
# state    4
# point    2
# other    0
# dtype: int64

引数axis=1とすると行に対して処理される。

print(df.count(axis=1))
# 0    3
# 1    0
# 2    2
# 3    4
# 4    3
# 5    2
# dtype: int64

欠損値の総数をカウント

pandas.DataFramevalues属性でNumPy配列numpay.ndarrayとして要素全体のデータを取得できる。

print(df.isnull().values)
# [[False False False  True  True]
#  [ True  True  True  True  True]
#  [False  True False  True  True]
#  [False False False False  True]
#  [False  True False False  True]
#  [False False  True  True  True]]

print(type(df.isnull().values))
# <class 'numpy.ndarray'>

pandas.DataFrameのメソッドsum()と異なり、numpy.ndarrayのメソッドsum()はデフォルトで全体の合計を算出する。

したがって、isnull()の結果のvalues属性(numpy.ndarray)からsum()を呼ぶと全体の欠損値の個数(総数)が取得できる。

print(df.isnull().values.sum())
# 16

欠損値でない要素の総数をカウント

欠損値でない要素の総数はcount()で取得できる行または列ごとの個数の合計をsum()で算出すればOK。

print(df.count().sum())
# 14

全体に欠損値が含まれているかを判定

上で示した欠損値の総数を使って、全体に欠損値が含まれているかを判定する。

欠損値の総数が0でなければ、全体に少なくとも一つは欠損値NaNが含まれている。

print(df.isnull().values.sum() != 0)
# True

欠損値の総数がsize属性(全要素数)と等しければ、全要素が欠損値NaNである。

print(df.size)
# 30

print(df.isnull().values.sum() == df.size)
# False

pandas.Seriesの場合

pandas.Seriesにもisnull()all(), any()などのメソッドがある。これまでの例と同様に処理できる。

s = df['state']
print(s)
# 0     NY
# 1    NaN
# 2     CA
# 3     TX
# 4     CA
# 5    NaN
# Name: state, dtype: object

print(s.isnull())
# 0    False
# 1     True
# 2    False
# 3    False
# 4    False
# 5     True
# Name: state, dtype: bool

print(s.isnull().any())
# True

print(s.isnull().all())
# False

print(s.isnull().sum())
# 2

print(s.count())
# 4
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事