Pandasで全て欠損値(NaN)の行を除く
特定のカラムを除いた後にすべて欠損値の行ができてしまうと後の解析でエラーを吐く可能性があるので取り除いておきたい場合がある。
frame.ix[frame.notnull().any(axis=1), :]
を使う。
isnull(), notnull()の出力を、all(), any()をaxisとともに組み合わせて他にも色々できる。
>>> import pandas as pd >>> import numpy as np >>> a = np.array([[np.nan, np.nan], [np.nan, 1.0], [0.0, 0.5]]) >>> frame = pd.DataFrame(data=a, index=[0,1,2], columns=[0,1]) >>> frame 0 1 0 NaN NaN 1 NaN 1.0 2 0.0 0.5 >>> frame.isnull() 0 1 0 True True 1 True False 2 False False >>> frame.notnull() 0 1 0 False False 1 False True 2 True True >>> frame.notnull().any(axis=1) 0 False 1 True 2 True dtype: bool >>> frame.ix[frame.notnull().any(axis=1), :] 0 1 1 NaN 1.0 2 0.0 0.5
追記:
strが含まれていると、型がうまく反映されず、np.nanが"nan"になってしまうことがある。
この場合isnull()がすべてFalseを吐く。以下のようにアドホックに置換するのが一つの解。
df.replace("nan", np.nan).isnull()
以下検証。
>>> a = np.array([[np.nan, np.nan],[np.nan, 1],[1,1]]) >>> df = pd.DataFrame(data=a, index=[0,1,2], columns=[0,1]) >>> df.isnull() 0 1 0 True True 1 True False 2 False False >>> a = np.array([[np.nan, np.nan],[np.nan, "aaa"],["aaa","aaa"]]) >>> df = pd.DataFrame(data=a, index=[0,1,2], columns=[0,1]) >>> df.isnull() 0 1 0 False False 1 False False 2 False False >>> df 0 1 0 nan nan 1 nan aaa 2 aaa aaa >>> df.replace("nan", np.nan) 0 1 0 NaN NaN 1 NaN aaa 2 aaa aaa >>> df.replace("nan", np.nan).isnull() 0 1 0 True True 1 True False 2 False False