欠損値の含まれる列、Series

生徒のテストの点数を表すデータを考えてみましょう。
Aliceさんは、テストを欠席したので、点数がありません。
このとき、点数を0としたのでは、本当に0点だったのか欠席したのか区別がつきません。

このような「データが存在しないことを表す値」が、欠損値です。
pandasでは、欠損値は非数(Not a Number; NaN)として割り当てられています。非数とは、「数値ではない」ことです。非数の値は、float("nan")という浮動小数点数型の値です。

たとえば、下記のdfで、1行目のPointは欠損値です。

df = pd.DataFrame(
    [["Alice", float("nan")], ["Bob", 75]],
    columns=["Name", "Point"],
)
df
NamePoint
0AliceNaN
1Bob75

欠損値は、float("nan")という浮動小数点数で、NaNなどと表示されることを学びました。

isnaを用いた検出

DataFrameや列であるSeriesの要素が欠損値かどうかは、isna()で判定できます。
結果は、元のオブジェクトと同じサイズになります。結果の各値は、欠損値かどうか(True/False)です。

たとえば、DataFrameに対してisna()を使うと、結果は次のように元のDataFrameと同じサイズのDataFrameになります。

pd.DataFrame([[1, 2, 3], [4, 5, 6]]).isna()
012
0FalseFalseFalse
1FalseFalseFalse

同様にSeriesは、以下のようになります。

pd.Series([1, 2]).isna()
0    False
1    False
dtype: bool

まとめると、DataFrameの変数dfに対し、df.isna()dfと同じサイズのDataFrameになります。
また、Seriesの変数srに対し、sr.isna()srと同じサイズのSeriesになります。

演習

import pandas as pd

df = pd.DataFrame(
    [["Alice", float("nan")], ["Bob", 75]],
    columns=["Name", "Point"],
)
df
NamePoint
0AliceNaN
1Bob75.0

DataFrameの各要素が欠損値かどうかをdf.isna()で求めます。列Pointの1行目だけTrueになります。

result1 = df.isna()
result1
NamePoint
0FalseTrue
1FalseFalse

Seriesの各要素が欠損値かどうかをdf.Point.isna()で求めます。1行目だけTrueになります。

result2 = df.Point.isna()
result2
0     True
1    False
Name: Point, dtype: bool

コメント

タイトルとURLをコピーしました