pandas.DataFrameのNaNを含む行を抽出
Table of Contents
欠損値を調べる際に,欠損値を含む行を抽出したいことがあります.方法を見つけるのに苦戦したのでここでまとめました.
最初にDataFrameの例を用意します.
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)], columns=['a', 'b', 'c'])
df
Out[1]:
isnull()は欠損値をTrueとする同型のDataFrameを返すメソッドです.
In [2]:
df.isnull()
Out[2]:
行に沿ってまたは列に沿ってTrueの要素があるかどうかを列または行のSeriesで返すメソッドがany()です.行に沿って調べ列を返すには引数axis=1とします.複数の列が存在するときは(DataFrameは複数列存在)一つでもTrueがある行はTrueになります.
In [3]:
df.isnull().any(axis=1)
Out[3]:
もし,axis=0とすると(あるいはaxis引数なし)列に沿ってTrueが存在するか調べ,行のSeriesを返します.Seriesなので見た目は列を返しますが,内容は列に沿ってTrueを調べると,列1と列2がTrueを含んでおり,列0はTrueがありませんので,False,True,Trueの3列を返します.
In [4]:
df.isnull().any(axis=0)
Out[4]:
先のdf.isnull().any(axis=1)に戻り,欠損値を含む,すなわちTrueの行のみを抽出するには,DataFrameの真偽値を使ったインデックス参照を行います.
In [5]:
df[df.isnull().any(axis=1)]
Out[5]:
元のDataFrameに戻って,列毎に欠損値の存在する位置を視覚的に示すには,indexを横軸に,列の値を縦軸とした図を描くとよいでしょう.そのためには,df.notnull()のTrue(すなわち,欠損値以外)を0,df.isnull()のTrue(すなわち欠損値)を1の値としたDataFrameを作り,それを折線グラフでplotすればよいでしょう.
In [6]:
df[df.notnull()]=0 ### 欠損値以外を0にする
df
Out[6]:
In [7]:
df[df.isnull()]=1 ### 欠損値を1にする
df
Out[7]:
In [8]:
df.plot(style=['o','x','4-'], alpha=0.8, grid=True)
Out[8]:
ありがとうございます。python初学者で「東京大学のデータサイエンティスト育成講座」のテキストを毎日コツコツ勉強しております。欠損値を含む行そのものを出力する方法が見つからず、途方にくれていました。このブログに書かれていた『df[df.isnull().any(axis=1)]』で解決しました。
さらに、なんでこんな簡単なことも自分はできないのだろう。。。と思っていたら、ブログ冒頭に「方法を見つけるのに苦戦したのでここでまとめました」とあり、先生にとっても安易な問題ではなかったのだと、逆に親近感が持てました。ありがとうございました。
(名前が非公開かどうかわからなかったので、ペンネームにしております。申し訳ありません。メアドは本物です)