pandasで欠損値を見つける・カウントする・置き換える

TAGS :

pd.isnaとpd.isnull

pd.isna() と pd.isnull() は同じものです。
GitHub のコード上でもそうなっています。
isnull = isna

pd.DataFrame.isna() と pd.DataFrame.isnull() も同じものです。
DataFrame.isnull is an alias for DataFrame.isna.

pandas.isna
pandas.isnull
pandas.DataFrame.isna
pandas.DataFrame.isnull

isna()で引っかかるもの

isna() で何を見つけられるか、見てみます。
0、空文字、スペース などは引っかかりません。

Python

    print(pd.isna(pd.NA))
    # True

    print(pd.isna(np.nan))
    # True

    print(pd.isna(math.nan))
    # True

    print(pd.isna(None))
    # True

    print(pd.isna(0))
    # False

    print(pd.isna(''))
    # False

    print(pd.isna(' '))
    # False

欠損値をカウントする

機械学習をするときに、特徴量に欠損値が無いか調べるときに使いたくなるはずです。

Python

    # DataFrameの例
    df = pd.DataFrame(dict(
        name=['John', 'Nana', 'Ken'],
        age=[10, np.nan, 3],
        country=['us', np.nan, np.nan],))
    print(df)
    #    name   age country
    # 0  John  10.0      us
    # 1  Nana   NaN     NaN
    # 2   Ken   3.0     NaN
        
    print(df.isna())
    #     name    age  country
    # 0  False  False    False
    # 1  False   True     True
    # 2  False  False     True
    
    # 各列の欠損値カウント
    print(df.isna().sum())
    # name       0
    # age        1
    # country    2
    # dtype: int64
    
    # 各行の欠損値カウント
    print(df.isna().sum(axis=1))
    # 0    0
    # 1    2
    # 2    1
    # dtype: int64
    
    # DataFrame全体の欠損値カウント
    print(df.isna().sum().sum())
    # 3

欠損値を見つけて、ゼロで埋める

欠損値を補間したくなることがあると思います。
DataFrame を作成し、age が欠損値になっている行を見つけ、欠損値を 0 に置き換えます。

Python

    # DataFrameの例
    df = pd.DataFrame(dict(
        name=['John', 'Nana', 'Ken'],
        age=[np.nan, np.nan, 3],
        country=['us', np.nan, np.nan],))
    print(df)
    #    name  age country
    # 0  John  NaN      us
    # 1  Nana  NaN     NaN
    # 2   Ken  3.0     NaN
        
    print(df['age'])
    # 0    NaN
    # 1    NaN
    # 2    3.0
    # Name: age, dtype: float64

    print(df['age'].isna())
    # 0     True
    # 1     True
    # 2    False
    # Name: age, dtype: bool

    # ageが欠損値の行のみ、表示する。
    print(df[df['age'].isna()])
    #    name  age country
    # 0  John  NaN      us
    # 1  Nana  NaN     NaN
    
    # ageが欠損値のIndexを指定して、0に置き換える。
    df.loc[df['age'].isna(), 'age'] = 0
    print(df)
    #    name  age country
    # 0  John  0.0      us
    # 1  Nana  0.0     NaN
    # 2   Ken  3.0     NaN

    # countryが欠損値になっている行を、unknownに置き換える。
    df.loc[df['country'].isna(), 'country'] = 'unknown'
    print(df)
    #    name  age  country
    # 0  John  0.0       us
    # 1  Nana  0.0  unknown
    # 2   Ken  3.0  unknown
        
    # 欠損値をカウントする。
    print(df.isna().sum().sum())
    # 0