Python pandas DataFrame.dropna() でNaNが含まれる行や列を削除する

こんにちは、kisseです。

収集したデータにNaNが入ったまま処理を行って、意図しない結果が出るのイライラしませんか?
僕がバイトで扱うようなデータにはそんな場合が多くてイライラしてました。笑

なんとなくpandas.DataFrameのメソッド一覧を眺めてたら、dropna()っていうメソッドを見つけて調べてみたらかなりいいやつでした。
今回はDataFrame.dropna()でNaNが含まれる列や行を取り除く方法です。

dropna()で今回使う引数

公式のドキュメントをみてみると色々な引数が存在しますが、今回は2つの引数のみ使います。

その引数は以下の2つです。

  • axis
  • how

axisですが、これには0か’index’もしくは1か’columns’を渡します。
0か’index’を指定した場合、データフレームの1行ごとに注目します。
1か’columns’を指定した場合、データフレームの1列ごとに注目します。

次にhowには、’all’か’any’を指定します。
‘all’の場合、axisで指定した行か列が全てNaNであった場合、その行または列を削除します。
‘any’の場合、axisで指定した行か列に1つでもNaNが含まれる場合に、その行または列を削除します。

説明がむずかしいので、次にサンプルをみてみます。

実行サンプル

まずはライブラリをインポートしてデータフレームを作成しましょう。
今回はNaNの表現にnumpy.nanを使います。

import pandas as pd
import numpy as np


dataframe = pd.DataFrame(
    [['hoge', np.nan], ['Fuga', 'Fuga'], [np.nan, np.nan]], 
    columns = ['columnA', 'columnB'])

print(dataframe)
# >>  columnA columnB
# >>0    hoge     NaN
# >>1    Fuga    Fuga
# >>2     NaN     NaN

データフレームを作成したので、引数に渡す値を変えながらdropna()を実行してみましょう。
最初はaxis = 0, how = ‘any’を渡してみます。

# 最初にaxis = 0, how = 'any'を指定してみる
print(dataframe.dropna(axis = 0, how = 'any'))
# >>   columnA columnB
# >> 1    Fuga    Fuga

# このように、NaNが含まれる行が全て削除されている

このように、axis = 0を指定すると行が削除されます。how = ‘any’と指定しているので、行に1つでもNaNが含まれるとその行が削除されます。

次は、axis = 1, how = ‘any’を引数に渡します。

# 次にaxis = 1, how = "any'を指定してみる
print(dataframe.dropna(axis = 1, how = 'any'))
# >> Empty DataFrame
# >> Columns: []
# >> Index: [0, 1, 2]

# どの列にもNaNが含まれているので、全ての列が削除されてindexのみが残った

データフレームの要素が全て削除されてしまいました。
axis = 1を指定すると、列が削除されます。
how = ‘any’を指定したので、列に1つでもNaNが含まれればその列が削除されます。
今回の場合、全ての列にNaNが含まれていたので、全ての列が削除されてしまったんですね。

最後にaxis = 0, how = ‘all’を指定します。

# 最後にaxis = 0, how = 'all'を指定する
print(dataframe.dropna(axis = 0, how = 'all'))
# >>  columnA columnB
# >> 0    hoge     NaN
# >> 1    Fuga    Fuga

# 全ての要素がNaNの行が削除されるので、一番最後の行のみが削除される

axis = 0が指定されているので、行が削除されます。
how = ‘all’が指定されているので、全ての要素がNaNの行のみ削除されます。

ところで、dropna()を実行しても、戻り値が実行結果なだけであり、データフレームの内容は変更されていません。
データフレームからNaNを削除したあとに、データフレームの内容をそれに更新したい場合には、結果を代入します。

# dropna()を実行しても、dataframeの内容は変更されないので、dataframeの内容を変更する場合には結果を代入する。
dataframe = dataframe.dropna(axis = 0, how = 'any')

以上のようにすることにより、dataframeの内容が更新されます。

おわり

実際に使う場合、axis=0, how=’any’を指定することが多いんじゃないでしょうか。

例えばデータベースに格納してあるレコードを取得してデータフレームを生成したのち、NaNが含まれるレコードを削除したりできますね。
データ分析とかやるときにNaNとかあるとかなりうざいので、そうやってデータを簡単にしてから作業したりしてます。

結構便利なので、僕は多用してますね。

最後まで、読んでいただきありがとうございます!
バイト先でデータ分析みたいな仕事をやってることもあり、Pythonに関する記事が多めです。
Python関連の他の記事も是非!

あわせて読みたい