Python Pandas如何在不显式列出列的情况下从DataFrame中选择包含一个或多个空值的行?

Lev*_*tor 198 python null nan pandas

我有一个〜300K行和~40列的数据帧.我想知道是否有任何行包含空值 - 并将这些'null'行放入一个单独的数据帧中,以便我可以轻松地探索它们.

我可以明确地创建一个掩码:

mask = False
for col in df.columns: 
    mask = mask | df[col].isnull()
dfnulls = df[mask]
Run Code Online (Sandbox Code Playgroud)

或者我可以这样做:

df.ix[df.index[(df.T == np.nan).sum() > 1]]
Run Code Online (Sandbox Code Playgroud)

是否有一种更优雅的方式(找到包含空值的行)?

DSM*_*DSM 336

[更新以适应现代pandas,其isnull作为一种方法DataFrame...]

您可以使用isnullany构建一个布尔系列,并使用它来索引您的框架:

>>> 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
Run Code Online (Sandbox Code Playgroud)

[对于年长者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
Run Code Online (Sandbox Code Playgroud)

导致相当紧凑:

In [60]: df[pd.isnull(df).any(axis=1)]
Out[60]: 
   0   1   2
1  0 NaN   0
2  0   0 NaN
Run Code Online (Sandbox Code Playgroud)


Rok*_*jic 57

nans = lambda df: df[df.isnull().any(axis=1)]
Run Code Online (Sandbox Code Playgroud)

那么当你需要它时你可以输入:

nans(your_dataframe)
Run Code Online (Sandbox Code Playgroud)

  • @vishal我想您需要做的就是添加loc这样的;`df.loc [df.isnull()。any(axis = 1)]` (2认同)
  • 顺便说一句 - 你不应该命名你的**匿名**(lambda)函数。[始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句。](https://www.python.org/dev/peps/pep-0008/#programming-recommendations) (2认同)

Jac*_*ack 8

少了四个字符,但多了 2 毫秒

\n
%%timeit\ndf.isna().T.any()\n# 52.4 ms \xc2\xb1 352 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n\n%%timeit\ndf.isna().any(axis=1)\n# 50 ms \xc2\xb1 423 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

我可能会用axis=1

\n


Rod*_*rin 7

如果要按具有空值的特定数量的列过滤行,可以使用以下命令:

df.iloc[df[(df.isnull().sum(axis=1) >= qty_of_nuls)].index]
Run Code Online (Sandbox Code Playgroud)

所以,这是一个例子:

您的数据框:

>>> df = pd.DataFrame([range(4), [0, np.NaN, 0, np.NaN], [0, 0, np.NaN, 0], range(4), [np.NaN, 0, np.NaN, np.NaN]])
>>> df
     0    1    2    3
0  0.0  1.0  2.0  3.0
1  0.0  NaN  0.0  NaN
2  0.0  0.0  NaN  0.0
3  0.0  1.0  2.0  3.0
4  NaN  0.0  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

如果要选择具有两个或多个空值列的行,请运行以下命令:

>>> qty_of_nuls = 2
>>> df.iloc[df[(df.isnull().sum(axis=1) >=qty_of_nuls)].index]
     0    1    2   3
1  0.0  NaN  0.0 NaN
4  NaN  0.0  NaN NaN
Run Code Online (Sandbox Code Playgroud)