我有〜300K行〜40列的数据帧。 我想找出是否有任何行包含空值 - 并把这些“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]]
是否有这样做(在他们的空值定位行)的更优雅的方式?
[更新以适应现代pandas
,其具有isnull
作为一个方法DataFrame
秒。]
您可以使用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
nans = lambda df: df[df.isnull().any(axis=1)]
那么当你永远需要它,你可以键入:
nans(your_dataframe)
文章来源: Python Pandas How to select rows with one or more nulls from a DataFrame without listing columns explicitly?