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

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

PandasのDataFrameを使うと、データ解析の際に欠損値の対応を行う操作は豊富に提供されています。

この記事では、欠損値を削除するdf.dropnaメソッドを紹介します。

dropnaメソッドを使うと

  • 列を基準に欠損値を削除
  • 行を基準に欠損値を削除

などの操作が簡単にできますよ!

欠損値を置換するdf.fillnanaと合わせて、df.dropnaの使い方を覚えてしまいましょう!

【Pandas入門】DataFrame中の欠損値(NaN)の置換を行うdf.fillna
更新日 : 2020年5月8日

欠損値

欠損値とは

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だ」といったときには列や行ごと削除してしまう操作がしたくなります。

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

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

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

フクロウ

フクロウ

第一言語はPythonです。
皆さんRustやりましょう。