Pythonのpandas DataFrameでこんな悩みはありませんか?
「Pandas DataFrameでNaN(欠損値)を処理したい、、しかしやり方がわからない。」
「Pandas DataFrameでNaN(欠損値)を補完したい、、しかしやり方がわからない。」
「Pandasのfillna( )メソッドの使い方を詳しく知りたい。」
今回は特にpandasのfillna( )メソッドで欠損値を補完する方法について解説します。
また欠損値があるかどうかの確認は、下記記事参照。
早速解説します。
欠損値の処理方法
欠損値の処理方法は大きく分けて2つあります。
- 欠損値を含む行・列を削除する方法(pandasのdropna( )メソッド
- 欠損値を何らかの値で補完する方法(pandasのfillna( )メソッド)
pandasのdropna( )メソッドの解説は下記記事参照。
今回はpandas DataFrameの欠損値を補完する方法(fillna( )メソッド)について解説します。
今回は下記のようなpandas DataFrameを用いて解説。以下dfとして解説します。
df = pd.DataFrame({ 'A': [1, 2, np.nan, 4, np.nan], 'B': [5, np.nan, 7, 8, np.nan], 'C': [9, 10, 11, 12, np.nan] })
pandasのfillna( )メソッドの使い方
pandasのfillna( )メソッドは、pandas DataFrame内のNaN(Not a Number)と表示される欠損値を特定の要素で補完するために使います。今回は数値で補完する場合で解説してみます。
基本的な使用方法は以下の通り。
このコードを実行すると、`df` 内のすべてのNaNが「値」で置き換えられます。
例えば、すべてのNaNを0で置き換えたい場合は、下記のように記載すればいいです。
下の実行結果を見ると、df内の全てのNaNが0に置き換わっていることが確認できると思います。
df.fillna(0)
特定の列だけを対象にして欠損値を補完したい場合
pandas fillnaメソッドを特定の列にのみ適用したい場合は、以下のようにします。
このコードでは、指定された’列名’の全てのNaNが「値」で置き換えられます。
例えば、A列のNaNを3で置き換えたい場合は、下記のように記載すればいいです。
A列のNaNが3に変わっていることを確認できるかと思います。
df['A'].fillna(3)
よく使う使い方
列の平均値で置き換える場合
df[‘列名’].mean()でその列の平均値を算出できます。
これを用いてdfのA列のNaNを「A列の平均値」で補完してみます。
下の実行結果を確認すると、NaNがA列の平均値に置き換わっています。
df['A'].fillna(df['A'].mean())
pandas fillna( )メソッドを使う時の注意点
dfを更新しないと、欠損値の補完がdfに反映されない。
下記のようにdf.fillna(0)を実行してdfを出力しても、NaNのままになってしまう。
欠損値の補完をdfに反映させるためには、「欠損値補完後のdf」をdfとする必要がある。
以下のようにdf = df.fillna(0)とdfを更新することで、df内の全てのNaNが0に置き換わっていて、dfが更新されていることがわかる。
df = df.fillna(0) df
列を補完する場合も同様。
列を補完する場合も更新しないと欠損値処理が反映されないが、df[‘列名’] = df[‘列名’].fillna(値)のように、df[‘列名’]を更新する必要があるので、df = df[‘列名’].fillna(値)としないように注意。
こう書くと、その列だけがdfとなってしまう。
列の更新をする際は。「df[‘列名’] = 」とすること。
A列の欠損値を平均値で補完する際のコードがこちら。
A列の欠損値が平均値で補完されていることを確認できると思います。
df['A'] = df['A'].fillna(df['A'].mean()) df
特に列の平均値で補完することは非常に多いので、完全に理解しておくのが望ましいです❗️
最後に「こんな補完方法もあるよ」という内容を紹介します。
欠損値を前後のデータで補完することもできる
時系列のデータを扱う場合は下記のように前後の値で補完する方法もありです。
時系列のデータはNaNをデータの平均で補完すると、意味がわからなくなるので。。
pandas fillna()メソッドのmethod引数を`ffill`または`bfill`に設定することで、前の値または後ろの値で補完することができます。
df.fillna(method='ffill') # 前の値で補完 df.fillna(method='bfill') # 後ろの値で補完
これは、こういうことができるんだ〜というくらいの認識でOKです。
今回の記事では、pandasのfillna( )メソッドの基本的な使い方や、列の平均値で補完する方法、さらには初学者が陥りやすいミスについて解説しました。
皆さんのpythonの勉強に少しでもお役に立てれば幸いです!!