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

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ファイルはコチラ。

sample_pandas_normal_nan.csv

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

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

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

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

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

pandas.DataFrame.isnull — pandas 0.23.0 documentation

各要素に対して判定を行い、欠損値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を返す。

pandas.DataFrame.all — pandas 0.23.0 documentation

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を返す。

pandas.DataFrame.any — pandas 0.23.0 documentation

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を返す。

pandas.DataFrame.sum — pandas 0.23.0 documentation

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を返す。

pandas.DataFrame.count — pandas 0.23.0 documentation

isnull()の結果ではなく、元のpandas.DataFrameから直接呼べば問題ありません。 デフォルトでは列に対して処理される。

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.DataFrameのvalues属性で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()で算出すれば問題ありません。

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

シェア

関連カテゴリー

Python pandas

pandasの要素としてリストを格納し処理 pandasでユニークな要素の個数、頻度(出現回数)をカウント pandas.DataFrame, Seriesを辞書に変換(to_dict) pandasのcut, qcut関数でビニング処理(ビン分割) pandasからNumPyの関数などを使う方法(pd.np) pandasのMultiindexで階層ごとの統計量・サンプル数を算出 pandas.DataFrameの行番号、列番号を取得 pandasで中央値を取得するmedian Pythonで正規化・標準化(リスト、NumPy配列、pandas.DataFrame) pandasで欠損値NaNを前後の値から補間するinterpolate pandasでJSON文字列・ファイルを読み込み(read_json) pandas.DataFrameの行・列を指定して削除するdrop pandasでカテゴリ変数をダミー変数に変換(get_dummies) pandas.DataFrameから特定の型dtypeの列を抽出(選択) pandas.DataFrameの列をインデックス(行名)に割り当てるset_index

Last Updated: 6/26/2019, 10:34:03 PM