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]:
a b c
0 0 1.0 2.0
1 0 NaN 0.0
2 0 0.0 NaN
3 0 1.0 2.0
4 0 1.0 2.0

isnull()は欠損値をTrueとする同型のDataFrameを返すメソッドです.

In [2]:
df.isnull()
Out[2]:
a b c
0 False False False
1 False True False
2 False False True
3 False False False
4 False False False

行に沿ってまたは列に沿ってTrueの要素があるかどうかを列または行のSeriesで返すメソッドがany()です.行に沿って調べ列を返すには引数axis=1とします.複数の列が存在するときは(DataFrameは複数列存在)一つでもTrueがある行はTrueになります.

In [3]:
df.isnull().any(axis=1)
Out[3]:
0    False
1     True
2     True
3    False
4    False
dtype: bool

もし,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]:
a    False
b     True
c     True
dtype: bool

先のdf.isnull().any(axis=1)に戻り,欠損値を含む,すなわちTrueの行のみを抽出するには,DataFrameの真偽値を使ったインデックス参照を行います.

In [5]:
df[df.isnull().any(axis=1)]
Out[5]:
a b c
1 0 NaN 0.0
2 0 0.0 NaN

元のDataFrameに戻って,列毎に欠損値の存在する位置を視覚的に示すには,indexを横軸に,列の値を縦軸とした図を描くとよいでしょう.そのためには,df.notnull()のTrue(すなわち,欠損値以外)を0,df.isnull()のTrue(すなわち欠損値)を1の値としたDataFrameを作り,それを折線グラフでplotすればよいでしょう.

In [6]:
df[df.notnull()]=0  ### 欠損値以外を0にする
df
Out[6]:
a b c
0 0 0.0 0.0
1 0 NaN 0.0
2 0 0.0 NaN
3 0 0.0 0.0
4 0 0.0 0.0
In [7]:
df[df.isnull()]=1   ### 欠損値を1にする
df
Out[7]:
a b c
0 0 0.0 0.0
1 0 1.0 0.0
2 0 0.0 1.0
3 0 0.0 0.0
4 0 0.0 0.0
In [8]:
df.plot(style=['o','x','4-'], alpha=0.8, grid=True)
Out[8]:
<matplotlib.axes._subplots.AxesSubplot at 0x1b038ac710>

pandas.DataFrameのNaNを含む行を抽出” に対して1件のコメントがあります。

  1. 虎千代 より:

     ありがとうございます。python初学者で「東京大学のデータサイエンティスト育成講座」のテキストを毎日コツコツ勉強しております。欠損値を含む行そのものを出力する方法が見つからず、途方にくれていました。このブログに書かれていた『df[df.isnull().any(axis=1)]』で解決しました。
     さらに、なんでこんな簡単なことも自分はできないのだろう。。。と思っていたら、ブログ冒頭に「方法を見つけるのに苦戦したのでここでまとめました」とあり、先生にとっても安易な問題ではなかったのだと、逆に親近感が持てました。ありがとうございました。
    (名前が非公開かどうかわからなかったので、ペンネームにしております。申し訳ありません。メアドは本物です)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください