web-dev-qa-db-ja.com

Pythonのパンダ列を明示的にリストせずにDataFrameから1つ以上のnullを持つ行を選択する方法

300K行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がある行を見つける)。

169
Lev Selector

[pandasのメソッドとしてisnullを持つ現代のDataFrameに適応するように更新。]

isnullanyを使ってブール値のSeriesを構築し、それを使ってフレームにインデックスを付けることができます。

>>> 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
291
DSM
nans = lambda df: df[df.isnull().any(axis=1)]

それからあなたがそれを必要とする時はいつでもあなたはタイプすることができます:

nans(your_dataframe)
42
Roko Mijic