pandas – isna、notna で欠損値かどうかを判定する方法

目次

概要

pandas で欠損値かどうかを判定する方法について紹介します。

欠損値

データ上でなんらかの理由により記録されなかった値のことを欠損値 (missing data) といいます。 CSV 上では、欠損値は空欄や “N/A” という文字列など様々な表し方がありますが、pandas で扱う場合は、欠損値は浮動小数点数の NaN (Not a Number、非数) を割り当てることになっています。 NaN は本来、0除算など定義されない浮動小数点演算を行った結果を表すために用意された特殊な浮動小数点数の一つです。 また pandas では NaN 以外に NoneNaT (Not a Time) も欠損値として扱われます。

欠損値かどうかは比較は比較演算子 == でやってはいけない

NaN 同士の比較は False となるように浮動小数点演算の規格 (IEEE754) で定義されています。そのため、欠損値かどうかを判定するには、pandas.isna() のように専用の関数を使用します。

In [1]:
import numpy as np

print(np.nan == np.nan)
False

pandas.DataFrame.count – 欠損値でない数を数える

pandas.DataFrame.count() は、行または列ごとに欠損値でない数を数えます。

  • df.count(axis=0): 行ごとに欠損値でない数を数えます。
  • df.count(axis=1): 列ごとに欠損値でない数を数えます。
DataFrame.count(self, axis=0, level=None, numeric_only=False)
引数
名前 デフォルト値
axis {0 or ‘index’, 1 or ‘columns’} 0
数える方向
level int or str, optional
MultiIndex の場合に、集計する階層を指定します。
numeric_only bool False
numeric_only=True の場合は float、int、bool 以外が含まれる行 (列) は集計対象から除外します。

返り値
名前 説明
Series or DataFrame 欠損値でない数

axis – 数える方向

In [2]:
df = pd.DataFrame(
    [
        [None, 2, 3, 4, 5],
        [None, 7, 8, 9, 10],
        [11, 12, 13, 14, 15],
        [16, 17, 18, None, 20],
        [None, None, None, None, None],
    ],
    index=["a", "b", "c", "d", "e"],
    columns=["A", "B", "C", "D", "E"],
)
display(df)

print(df.count(axis=0))

print(df.count(axis=1))
A B C D E
a NaN 2.0 3.0 4.0 5.0
b NaN 7.0 8.0 9.0 10.0
c 11.0 12.0 13.0 14.0 15.0
d 16.0 17.0 18.0 NaN 20.0
e NaN NaN NaN NaN NaN
A    2
B    4
C    4
D    3
E    4
dtype: int64
a    4
b    4
c    5
d    4
e    0
dtype: int64

level – MultiIndex の場合に階層ごとに数える

MultiIndex の場合は level で集計する階層を指定できます。

In [3]:
df = pd.DataFrame(
    [
        [None, 2, 3, 4, 5],
        [None, 7, 8, 9, 10],
        [11, 12, 13, 14, 15],
        [16, 17, 18, None, 20],
        [None, None, None, None, None],
    ],
    index=pd.MultiIndex.from_tuples(
        [("a", 0), ("a", 1), ("b", 0), ("c", 0), ("c", 1)], names=["lv1", "lv2"]
    ),
    columns=["A", "B", "C", "D", "E"],
)
display(df)

display(df.count(axis=0, level=0))

display(df.count(axis=0, level=1))
A B C D E
lv1 lv2
a 0 NaN 2.0 3.0 4.0 5.0
1 NaN 7.0 8.0 9.0 10.0
b 0 11.0 12.0 13.0 14.0 15.0
c 0 16.0 17.0 18.0 NaN 20.0
1 NaN NaN NaN NaN NaN
A B C D E
lv1
a 0 2 2 2 2
b 1 1 1 1 1
c 1 1 1 0 1
A B C D E
lv2
0 2 3 3 2 3
1 0 1 1 1 1

numeric_only – すべての値が数値の行 (列) のみ数える

In [4]:
df = pd.DataFrame(
    [
        ["hoge", 2, 3, 4, 5],
        [None, 7, 8, 9, 10],
        [11, 12, None, 14, 15],
        [16, 17, 18, "hoge", 20],
        [None, None, None, None, None],
    ],
    index=["a", "b", "c", "d", "e"],
    columns=["A", "B", "C", "D", "E"],
)
display(df)

print(df.count(axis=0, numeric_only=True))
A B C D E
a hoge 2.0 3.0 4 5.0
b None 7.0 8.0 9 10.0
c 11 12.0 NaN 14 15.0
d 16 17.0 18.0 hoge 20.0
e None NaN NaN None NaN
B    4
C    3
E    4
dtype: int64

pandas.Series.count

pandas.Series.count() は、欠損値でない数を数えます。

Series.count(self, level=None)
引数
名前 デフォルト値
level int or level name None
MultiIndex の場合に、集計する階層を指定します。

返り値
名前 説明
int or Series (if level specified) 欠損値でない数
In [5]:
s = pd.Series([None, 2, 3, 4, None])
print(s.count())
3

NaN でない値のインデックスを取得する

In [6]:
df = pd.DataFrame(
    [
        [None, None, None, None, None],
        [None, 2, 3, 4, 5],
        [None, None, 8, 9, 10],
        [11, 12, 13, 14, 15],
        [None, None, None, None, None],
    ],
    index=["a", "b", "c", "d", "e"],
    columns=["A", "B", "C", "D", "E"],
)

print(df.first_valid_index())
print(df.last_valid_index())
b
d
In [7]:
s = pd.Series([None, 2, 3, 4, None], index=["a", "b", "c", "d", "e"])

print(s.first_valid_index())
print(s.last_valid_index())
b
d

pandas.Series.hasnans – NaN が含まれるかどうか

pandas.Series.hasnans は、Series に NaN が含まれるかどうかを返します。

In [8]:
s = pd.Series([None, 2, 3, 4, None])
print(s.hasnans)
True

NaN かどうかを判定する

In [9]:
import numpy as np
import pandas as pd

df = pd.DataFrame(
    np.array([[1, 2, None], [4, 5, 6], [np.nan, 8, 9]]),
    index=["a", "b", "c"],
    columns=["A", "B", "C"],
)
display(df)

display(pd.isna(df))  # または  pd.isnull(df)
display(pd.notna(df))  # または  pd.notnull(df)
A B C
a 1 2 None
b 4 5 6
c NaN 8 9
A B C
a False False True
b False False False
c True False False
A B C
a True True False
b True True True
c False True True
In [10]:
s = pd.Series([1, 2, np.nan, 4, None])
print(pd.isna(s))  # または  pd.isnull(s)
print(pd.notna(s))  # または  pd.notnull(s)
0    False
1    False
2     True
3    False
4     True
dtype: bool
0     True
1     True
2    False
3     True
4    False
dtype: bool

コメント

コメントする

目次