列を明示的にリストせずに、Pandas DataFrame から 1 つ以上の null を含む行を選択するにはどうすればよいでしょうか? 質問する

列を明示的にリストせずに、Pandas DataFrame から 1 つ以上の null を含む行を選択するにはどうすればよいでしょうか? 質問する

約 30 万行、約 40 列のデータフレームがあります。行に null 値が含まれているかどうかを調べ、これらの「null」行を別のデータフレームに入れて簡単に調べられるようにしたいと考えています。

マスクを明示的に作成できます:

mask = False
for col in df.columns: 
    mask = mask | df[col].isnull()
dfnulls = df[mask]

または、次のようなこともできます:

df.ix[df.index[(df.T == np.nan).sum() > 1]]

もっとエレガントな方法(null を含む行を見つける)はありますか?

ベストアンサー1

[ sの方法として現代の に適応pandasするように更新されました。]isnullDataFrame

isnullと を使用しanyてブール型のシリーズを構築し、それを使用してフレームにインデックスを付けることができます。

>>> df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])
>>> df.isnull()
       0      1      2
0  False  False  False
1  False   True  False
2  False  False   True
3  False  False  False
4  False  False  False
>>> df.isnull().any(axis=1)
0    False
1     True
2     True
3    False
4    False
dtype: bool
>>> df[df.isnull().any(axis=1)]
   0   1   2
1  0 NaN   0
2  0   0 NaN

[年長者向けpandas:]

isnullメソッドの代わりに関数を使用することもできます。

In [56]: df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])

In [57]: df
Out[57]: 
   0   1   2
0  0   1   2
1  0 NaN   0
2  0   0 NaN
3  0   1   2
4  0   1   2

In [58]: pd.isnull(df)
Out[58]: 
       0      1      2
0  False  False  False
1  False   True  False
2  False  False   True
3  False  False  False
4  False  False  False

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

かなり簡潔になります:

In [60]: df[pd.isnull(df).any(axis=1)]
Out[60]: 
   0   1   2
1  0 NaN   0
2  0   0 NaN

おすすめ記事