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関連の他の記事も是非!