Pythonデータ洗浄の処理欠落値

5090 ワード

一、欠落値の処理
1.一般的な方法
  • dropna
  • import numpy as np
    import pandas as pd
    
    string_data = pd.Series(['apple','banana',np.nan,'orange'])
    print(string_data.dropna())
    

    これにより、NAを含む行が除去される
    0     apple
    1    banana
    3    orange
    dtype: object
    
  • fillna
  • string_data = pd.Series(['apple','banana',np.nan,'orange'])
    print(string_data.fillna(1))
    

    結果を出力すると、NAは括弧内の値になります
    0     apple
    1    banana
    2         1
    3    orange
    dtype: object
    

    また、入力パラメータmethod=‘ffill’は、NAを前の行の値に埋め込むことができる
    0     apple
    1    banana
    2    banana
    3    orange
    dtype: object
    

    同様に、method=‘bfill’を入力し、NAを次の行の値に埋め込む
    0     apple
    1    banana
    2    orange
    3    orange
    dtype: object
    
  • isnull

  • メソッドは、欠落した値のブール値を返す
    string_data = pd.Series(['apple','banana',np.nan,'orange'])
    print(string_data.isnull())
    
    0    False
    1    False
    2     True
    3    False
    dtype: bool
    
  • notnull

  • isnullと逆関数
    string_data = pd.Series(['apple','banana',np.nan,'orange'])
    print(string_data.notnull())
    
    0     True
    1     True
    2    False
    3     True
    dtype: bool
    

    2.欠落した値dropnaをフィルタリングデフォルトでは欠落した値を含む行が削除されます.DataFrameオブジェクトを処理する場合、Seriesよりも複雑になります.DataFrameには行と列があるため、dropnaにパラメータを入力して異なるニーズを満たすことができます.
    data = pd.DataFrame(np.arange(16).reshape(4,4))
    data.iloc[1,1:] = np.nan
    data.iloc[2,:] = np.nan
    data.iloc[:,3] = np.nan
    data[0][3] = np.nan
    print(data)
    
         0     1     2   3
    0  0.0   1.0   2.0 NaN
    1  4.0   NaN   NaN NaN
    2  NaN   NaN   NaN NaN
    3  NaN  13.0  14.0 NaN
    
  • how

  • dropnaにhow="all"が入力されると、すべての値がNAの行が削除されます.
    print(data.dropna(how='all'))
    
         0     1     2   3
    0  0.0   1.0   2.0 NaN
    1  4.0   NaN   NaN NaN
    3  NaN  13.0  14.0 NaN
    
  • axis

  • dropnaにaxis=1が入力されると、削除された次元を行ごとに削除する、すなわち列を削除する(混同しやすい)
    print(data.dropna(how='all',axis=1))
    
         0     1     2
    0  0.0   1.0   2.0
    1  4.0   NaN   NaN
    2  NaN   NaN   NaN
    3  NaN  13.0  14.0
    
  • thresh
  • df = pd.DataFrame(np.arange(21).reshape(7,3))
    df.iloc[:4,1] = np.nan
    df.iloc[:2,2] = np.nan
    print(df)
    
    
        0     1     2
    0   0   NaN   NaN
    1   3   NaN   NaN
    2   6   NaN   8.0
    3   9   NaN  11.0
    4  12  13.0  14.0
    5  15  16.0  17.0
    6  18  19.0  20.0
    

    dropnaにthresh=2を入力し、少なくとも2つの非NA値を含む行を出力する
    print(df.dropna(thresh=2))
    
        0     1     2
    2   6   NaN   8.0
    3   9   NaN  11.0
    4  12  13.0  14.0
    5  15  16.0  17.0
    6  18  19.0  20.0
    

    3.欠落値を補完するほとんどの場合、主にfillnaを使用して欠落値を補完します.次にfillnaのパラメータについて説明します.
  • Value

  • fillnaを呼び出すと、欠落した値の代わりに定数/文字列を使用できます.
    df = pd.DataFrame(np.arange(21).reshape(7,3),dtype=float)
    df.iloc[:4,1] = np.nan
    df.iloc[:2,2] = np.nan
    print(df.fillna(99))
    
          0     1     2
    0   0.0  99.0  99.0
    1   3.0  99.0  99.0
    2   6.0  99.0   8.0
    3   9.0  99.0  11.0
    4  12.0  13.0  14.0
    5  15.0  16.0  17.0
    6  18.0  19.0  20.0
    

    Fillnaを呼び出すときに辞書を使用し、異なる列に異なる塗りつぶし値を設定できます.
    print(df.fillna({1:22,2:33}))
    
          0     1     2
    0   0.0  22.0  33.0
    1   3.0  22.0  33.0
    2   6.0  22.0   8.0
    3   9.0  22.0  11.0
    4  12.0  13.0  14.0
    5  15.0  16.0  17.0
    6  18.0  19.0  20.0
    
  • method

  • fillnaにmethod=‘ffill’またはmethod=‘bfill’を入力し、NA値を前の行または後の行の値に入力します.他のパラメータがない場合は、デフォルトは‘ffill’です.
    print(df.fillna(method='bfill'))
    
          0     1     2
    0   0.0  13.0   8.0
    1   3.0  13.0   8.0
    2   6.0  13.0   8.0
    3   9.0  13.0  11.0
    4  12.0  13.0  14.0
    5  15.0  16.0  17.0
    6  18.0  19.0  20.0
    
  • axis

  • Fillnaにaxis=1を入力、塗りつぶし方向を列ごとに塗りつぶす、すなわち横塗り(ここでは混同しやすい)に変換し、規定がなければaxis=0とデフォルトで設定する.
    print(df.fillna(method='ffill',axis=1))
    
          0     1     2
    0   0.0   0.0   0.0
    1   3.0   3.0   3.0
    2   6.0   6.0   8.0
    3   9.0   9.0  11.0
    4  12.0  13.0  14.0
    5  15.0  16.0  17.0
    6  18.0  19.0  20.0
    
  • limit

  • fillnaにlimitパラメータを入力して、順方向または後方向の充填時の最大の充填範囲を規定する
    print(df.fillna(method='ffill',axis=1,limit=1))
    
    
          0     1     2
    0   0.0   0.0   NaN
    1   3.0   3.0   NaN
    2   6.0   6.0   8.0
    3   9.0   9.0  11.0
    4  12.0  13.0  14.0
    5  15.0  16.0  17.0
    6  18.0  19.0  20.0
    
  • inplace fillnaはデフォルトで新しいオブジェクトを返します.元のオブジェクトを変更する場合は、パラメータinplace=True
  • を入力します.
    _ = df.fillna(22,inplace=True)
    print(df)
    
          0     1     2
    0   0.0  22.0  22.0
    1   3.0  22.0  22.0
    2   6.0  22.0   8.0
    3   9.0  22.0  11.0
    4  12.0  13.0  14.0
    5  15.0  16.0  17.0
    6  18.0  19.0  20.0