Pandas pd.notna() 関数
pd.notna()Pandasライブラリにおいて、欠損値を検出するための関数です。入力オブジェクトの各要素をチェックし、非欠損値かどうかを判定して、ブール値(True/False)で構成される結果を返します。
これはデータクリーニングで最もよく使われる関数の一つで、データ内の有効な値を素早く識別し、その後のデータ処理や分析に備えることができます。
単語の意味: not「not」は否定を表し、na「na」は"not available"(利用不可)の略で、合わせると「欠損値ではない」という意味になります。
基本構文とパラメータ
pd.notna()Pandasライブラリのトップレベル関数であり、直接pd.notna()呼び出すことも、SeriesまたはDataFrameオブジェクトの.notna()メソッドとして呼び出すこともできます。
構文形式
pd.notna(obj)
パラメータの説明
- パラメータ:
obj- 型: Series、DataFrame、リスト、配列、スカラー値など、任意のPythonオブジェクト。
- 説明: 非欠損値かどうかをチェックするオブジェクト。Pandasにおける欠損値には
None、NaN、NaT(欠損した時間タイプ)およびpandas.NA。
関数の説明
- 戻り値: 入力オブジェクトと同じ形状のブール値オブジェクトを返します。SeriesまたはDataFrameの場合は同じ型のオブジェクトを返し、スカラーの場合は単一のブール値を返します。
- 効果: 非欠損値に対してはTrueを返し、
True欠損値に対してはFalseを返します。False。
例
簡単なものから複雑なものまでの一連の例を通して、pd.notna()の使い方を徹底的にマスターしましょう。
例1:基本的な使い方 - スカラーとリスト内の欠損値を検出する
例
import pandas as pd
import numpy as np
# 1. スカラー値が非欠損値かどうかを検出
print("=== スカラー検出 ===")
print(f"pd.notna(10): {pd.notna(10)}") # 正常な数値 -> True
print(f"pd.notna('サンプル'): {pd.notna('サンプル')}") # 正常な文字列 -> True
print(f"pd.notna(None): {pd.notna(None)}") # None -> False
print(f"pd.notna(np.nan): {pd.notna(np.nan)}") # np.nan -> False
# 2. リスト内の欠損値を検出
print("\n=== リスト検出 ===)
data_list = [1, 2, np.nan, 'サンプル', None, 5]
result = pd.notna(data_list)
print(f"元のリスト: {data_list}")
print(f"検出結果: {result.tolist()}") # 確認しやすいようにリストに変換
import numpy as np
# 1. スカラー値が非欠損値かどうかを検出
print("=== スカラー検出 ===")
print(f"pd.notna(10): {pd.notna(10)}") # 正常な数値 -> True
print(f"pd.notna('サンプル'): {pd.notna('サンプル')}") # 正常な文字列 -> True
print(f"pd.notna(None): {pd.notna(None)}") # None -> False
print(f"pd.notna(np.nan): {pd.notna(np.nan)}") # np.nan -> False
# 2. リスト内の欠損値を検出
print("\n=== リスト検出 ===)
data_list = [1, 2, np.nan, 'サンプル', None, 5]
result = pd.notna(data_list)
print(f"元のリスト: {data_list}")
print(f"検出結果: {result.tolist()}") # 確認しやすいようにリストに変換
実行結果の予想:
=== 标量检测 ===
pd.notna(10): True
pd.notna('サンプル'): True
pd.notna(None): False
pd.notna(np.nan): False
=== 列表检测 ===
原始列表: [1, 2, nan, 'サンプル', None, 5]
检测结果: [True, False, True, False, True]
コードの解説:
pd.notna(10)とpd.notna('サンプル')正常な数値と文字列を検出すると、Trueを返し、True。pd.notna(None)とpd.notna(np.nan)PythonとNumPyの欠損値マーカーを検出すると、Falseを返します。False。- リストに対してpd.notna()を使用すると、
pd.notna()ブール型のリストが返され、欠損値の位置はFalseになります。False。
例2:Series内の欠損値を検出する
Seriesデータを処理する際、pd.notna()有効なデータを素早く特定できます。
例
import pandas as pd
import numpy as np
# 欠損値を含むSeriesを作成
s = pd.Series([1, 2, np.nan, 4, None, 'サンプル', np.nan])
print("=== 元のSeries ===")
print(s)
print(f"\n型: {type(s)})
# pd.notna() を使用して検出
print("\n=== pd.notna() 検出結果 ===)
result = pd.notna(s)
print(result)
# Seriesのnotna()メソッドを使用(同等の効果)
print("\n=== s.notna() メソッドによる検出 ===)
print(s.notna())
# 非欠損値を抽出
print("\n=== 非欠損値の抽出 ===)
print(s[s.notna()])
import numpy as np
# 欠損値を含むSeriesを作成
s = pd.Series([1, 2, np.nan, 4, None, 'サンプル', np.nan])
print("=== 元のSeries ===")
print(s)
print(f"\n型: {type(s)})
# pd.notna() を使用して検出
print("\n=== pd.notna() 検出結果 ===)
result = pd.notna(s)
print(result)
# Seriesのnotna()メソッドを使用(同等の効果)
print("\n=== s.notna() メソッドによる検出 ===)
print(s.notna())
# 非欠損値を抽出
print("\n=== 非欠損値の抽出 ===)
print(s[s.notna()])
実行結果の予想:
=== 原始 Series === 0 1 1 2 2 NaN 3 4 4 None 5 サンプル 6 NaN dtype: object === pd.notna() 检测结果 === 0 True 1 True 2 False 3 True 4 False 5 True 6 False dtype: bool === s.notna() 方法检测 === 0 True 1 True 2 False 3 True 4 False 5 True 6 False dtype: bool === 筛选非缺失值 === 0 1 1 2 3 4 5 サンプル dtype: object
コードの解説:
pd.notna(s)とs.notna()どちらもSeries内の欠損値を検出し、ブール型Seriesを返します。- ブールインデックスを利用すると、
s[s.notna()]すべての非欠損値の要素を素早く抽出でき、これはデータクリーニングで非常に実用的です。
例3:DataFrame内の欠損値を検出する
表形式データを処理する際、pd.notna()データの完全性を素早く把握できます。
例
import pandas as pd
import numpy as np
# 欠損値を含むDataFrameを作成
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Diana'],
'age': [25, np.nan, 30, 28],
'score': [85, 90, np.nan, 95]
})
print("=== 元のDataFrame ===")
print(df)
# DataFrame全体を検出
print("\n=== pd.notna() 検出結果 ===)
print(pd.notna(df))
# 列ごとに欠損値の数を検出
print("\n=== 各列の非欠損値の数 ===)
print(df.notna().sum())
# 行ごとに欠損値の数を検出
print("\n=== 各行の非欠損値の数 ===)
print(df.notna().sum(axis=1))
# 欠損値の割合を計算
print("\n=== 欠損値の割合 ===)
missing_ratio = df.isna().mean()
print(missing_ratio)
import numpy as np
# 欠損値を含むDataFrameを作成
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Diana'],
'age': [25, np.nan, 30, 28],
'score': [85, 90, np.nan, 95]
})
print("=== 元のDataFrame ===")
print(df)
# DataFrame全体を検出
print("\n=== pd.notna() 検出結果 ===)
print(pd.notna(df))
# 列ごとに欠損値の数を検出
print("\n=== 各列の非欠損値の数 ===)
print(df.notna().sum())
# 行ごとに欠損値の数を検出
print("\n=== 各行の非欠損値の数 ===)
print(df.notna().sum(axis=1))
# 欠損値の割合を計算
print("\n=== 欠損値の割合 ===)
missing_ratio = df.isna().mean()
print(missing_ratio)
実行結果の予想:
=== 原始 DataFrame ===
name age score
0 Alice 25 85.0
1 Bob NaN 90.0
2 None 30 NaN
3 Diana 28 95.0
=== pd.notna() 检测结果 ===
name age score
0 True True True
1 True False True
2 False True False
3 True True True
=== 每列非缺失值数量 ===
name 3
age 3
score 3
=== 每行非缺失值数量 ===
0 3
1 2
2 1
3 3
=== 缺失值比例 ===
name 0.25
age 0.25
score 0.25
コードの解説:
pd.notna(df)元のDataFrameと同じ形状のブール型DataFrameを返し、各位置が非欠損値かどうかを示します。df.notna().sum()各列の非欠損値の数を集計します。df.isna().mean()各列の欠損値の割合を計算し、データ品質の評価に役立てます。
その他の拡張ヒント:
pd.notna()とpd.isna()pd.notna()とpd.isna()は互いに逆の関係にあります。pd.notna()Trueを返す位置では、pd.isna()Falseを返します。逆もまた同様です。
Pandas よく使う関数