生徒のテストの点数を表すデータを考えてみましょう。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
Name | Point | |
---|---|---|
0 | Alice | NaN |
1 | Bob | 75 |
欠損値は、float("nan")
という浮動小数点数で、NaN
などと表示されることを学びました。
isnaを用いた検出
DataFrameや列であるSeriesの要素が欠損値かどうかは、isna()で判定できます。
結果は、元のオブジェクトと同じサイズになります。結果の各値は、欠損値かどうか(True/False)です。
たとえば、DataFrameに対してisna()を使うと、結果は次のように元のDataFrameと同じサイズのDataFrameになります。
pd.DataFrame([[1, 2, 3], [4, 5, 6]]).isna()
0 | 1 | 2 | |
---|---|---|---|
0 | False | False | False |
1 | False | False | False |
同様に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
Name | Point | |
---|---|---|
0 | Alice | NaN |
1 | Bob | 75.0 |
DataFrameの各要素が欠損値かどうかをdf.isna()
で求めます。列Point
の1行目だけTrueになります。
result1 = df.isna()
result1
Name | Point | |
---|---|---|
0 | False | True |
1 | False | False |
Seriesの各要素が欠損値かどうかをdf.Point.isna()
で求めます。1行目だけTrueになります。
result2 = df.Point.isna()
result2
0 True
1 False
Name: Point, dtype: bool
コメント