【Pandas入門】DataFrame中の欠損値(NaN)の削除を行うdf.dropna

こんにちは!インストラクターのフクロウです。

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
  • 要素数が足りないところ
In [1]:
# ライブラリのインポート
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
Out[1]:
0 1 2 3
0 1.0 2.0 NaN NaN
1 NaN 1.0 2.0 NaN
2 NaN NaN NaN NaN
In [2]:
# サンプルデータ2を作成
data2 = np.arange(12).reshape((3,4))
df2 = pd.DataFrame(data2)

# 欠損値を埋め込む
df2.at[1,2] = None

df2
Out[2]:
0 1 2 3
0 0 1 2.0 3
1 4 5 NaN 7
2 8 9 10.0 11

NaNの判別

NaNの判別方法はいくつかありますが、DataFrameを表示して見てNaNとなったものがそれである、というのが一番簡単です。

他には以下の関数でそれぞれの要素がNaNかどうかが判別できます。

  • pd.isnull
  • np.isnan
  • math.isnan
In [3]:
# 要素単体に対してNaNか判別

pd.isnull(df.at[1,0]) # NaNならTrue
Out[3]:
True
In [4]:
# DataFrame全体に対してNaNか判別

pd.isnull(df) # NaNならTrue, それ以外ならFalse
Out[4]:
0 1 2 3
0 False False True True
1 True False False True
2 True True True True

df.dropnaでNaNを削除

DataFrameのメソッドであるdropnaを使うことで、欠損値を削除できます。

howパラメータで「すべての要素がNaNなら削除」「一部がNaNなら削除」を選ぶことができます。

すべてNaNな行を削除

how=”all”で「すべての要素がNaNなら削除」

In [5]:
df.dropna(how="all")
Out[5]:
0 1 2 3
0 1.0 2.0 NaN NaN
1 NaN 1.0 2.0 NaN

2行目が全てNaNなので消えていますね。

一部がNaNな行を削除

how=”any”で「一部がNaNなら削除」

In [6]:
df2.dropna(how="any")
Out[6]:
0 1 2 3
0 0 1 2.0 3
2 8 9 10.0 11

df2だと1行目にNaNが入っているので消えていることが確認できました!

axisで列を削除

axis=1とする上の操作が列に対してできますよ!試してみましょう。

In [7]:
df.dropna(how="all", axis=1)
Out[7]:
0 1 2
0 1.0 2.0 NaN
1 NaN 1.0 2.0
2 NaN NaN NaN
In [8]:
df2.dropna(how="any", axis=1)
Out[8]:
0 1 3
0 0 1 3
1 4 5 7
2 8 9 11

まとめ

この記事では、PandasのDataFrameからNaNを削除する機能、dropnaメソッドについて紹介しました。

データ解析では、データの一部がNaNな場合は別の値で置き換えることが多いですが、「列の要素すべてがNaNだ」「行の要素すべてがNaNだ」といったときには列や行ごと削除してしまう操作がしたくなります。

こんなときに便利だと思います。

簡単な操作で使える機能ですし、是非覚えて使ってみてくださいね。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次