こんにちは!インストラクターのフクロウです。
PandasのDataFrameを使うと、データ解析の際に欠損値の対応を行う操作は豊富に提供されています。
この記事では、欠損値を削除するdf.dropnaメソッドを紹介します。
dropnaメソッドを使うと
- 列を基準に欠損値を削除
- 行を基準に欠損値を削除
などの操作が簡単にできますよ!
欠損値を置換するdf.fillnanaと合わせて、df.dropnaの使い方を覚えてしまいましょう!
欠損値
欠損値とは
PandasのDataFrameにおける欠損値とはNaN(Non a Number)で表される要素を言います。
NaNはこれに対応した関数を使わないと、正しく計算することができない面倒なものです。
ニューラルネットワークのパラメータにNaNが紛れ込むと、NaNが他のパラメータにも伝搬してしまい、すぐにNaNがすべての要素がNaNに汚染されてしまいます。
なのでNaNが入ったデータがあったら、これを削除したり、別の値で置き換える必要があります。
PandasにおけるNaN扱いになる要素
以下がPandasでNaN扱いになります。
- None
- np.nan
- math.nan
- 要素数が足りないところ
# ライブラリのインポート
import numpy as np
import pandas as pd
import math
# データの作成
data = [
[1 ,2, np.nan, np.nan], # 4要素
[math.nan, 1, 2, ], # 3要素
[None, None, None, None], # 4要素
]
# データフレームの作成
df = pd.DataFrame(data)
# データフレームの表示
df
# サンプルデータ2を作成
data2 = np.arange(12).reshape((3,4))
df2 = pd.DataFrame(data2)
# 欠損値を埋め込む
df2.at[1,2] = None
df2
NaNの判別
NaNの判別方法はいくつかありますが、DataFrameを表示して見てNaNとなったものがそれである、というのが一番簡単です。
他には以下の関数でそれぞれの要素がNaNかどうかが判別できます。
- pd.isnull
- np.isnan
- math.isnan
# 要素単体に対してNaNか判別
pd.isnull(df.at[1,0]) # NaNならTrue
# DataFrame全体に対してNaNか判別
pd.isnull(df) # NaNならTrue, それ以外ならFalse
df.dropnaでNaNを削除
DataFrameのメソッドであるdropnaを使うことで、欠損値を削除できます。
howパラメータで「すべての要素がNaNなら削除」か「一部がNaNなら削除」を選ぶことができます。
すべてNaNな行を削除
how=”all”で「すべての要素がNaNなら削除」
df.dropna(how="all")
2行目が全てNaNなので消えていますね。
一部がNaNな行を削除
how=”any”で「一部がNaNなら削除」
df2.dropna(how="any")
df2だと1行目にNaNが入っているので消えていることが確認できました!
axisで列を削除
axis=1とする上の操作が列に対してできますよ!試してみましょう。
df.dropna(how="all", axis=1)
df2.dropna(how="any", axis=1)
まとめ
この記事では、PandasのDataFrameからNaNを削除する機能、dropnaメソッドについて紹介しました。
データ解析では、データの一部がNaNな場合は別の値で置き換えることが多いですが、「列の要素すべてがNaNだ」「行の要素すべてがNaNだ」といったときには列や行ごと削除してしまう操作がしたくなります。
こんなときに便利だと思います。
簡単な操作で使える機能ですし、是非覚えて使ってみてくださいね。