Pandas DataFrame同时检查多列是否为空

5

鉴于以下内容:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[np.nan,1,2],'b':[np.nan,np.nan,4]})

     a    b
0  NaN  NaN
1  1.0  NaN
2  2.0  4.0

如何返回既有“a”列又有“b”列为空值的行,而不必针对每一列使用pd.isnull

期望结果:

     a    b
0  NaN  NaN

我知道这个方法可行(但这不是我想要的方式):

df.loc[(pd.isnull(df['a']) & (pd.isnull(df['b'])]

我尝试了这个:
df.loc[pd.isnull(df[['a', 'b']])]

...但是遇到了以下错误:

ValueError: Cannot index with multidimensional key

谢谢您提前的支持!
3个回答

7
你已经接近了:
df[~pd.isnull(df[['a', 'b']]).all(1)]

或者
df[df[['a','b']].isna().all(1)]

怎么样:

df.dropna(subset=['a','b'], how='all')

1
@DanceParty2 正在准备更新。完成! - Quang Hoang
太完美了!非常感谢。另外,.all(1)是什么意思? - Dance Party2
1
这是“all(axis=1)”的简写,即按行检查,默认为“axis=0”,按列检查。 - Quang Hoang

4

根据您提供的示例,请尝试以下步骤。在此处使用 isnull函数。

mask1 = df['a'].isnull()
mask2 = df['b'].isnull()
df[mask1 & mask2]

上面的答案是为了更好地理解而创建两个变量。如果您想在 df 本身内使用条件,并且不想创建条件变量 (在这种情况下是 mask1mask2),请尝试以下操作。
df[df['a'].isnull() & df['b'].isnull()]

输出结果如下。
    a   b
0   NaN NaN

2
您可以使用 dropna() 函数,参数为 how=all
df.dropna(how='all')

输出:

   a    b
1  1.0  NaN
2  2.0  4.0

由于问题已经更新,你可以使用df.isnull()df.isna()创建掩码,并相应地进行过滤。

df[df.isna().all(axis=1)]
   a   b
0 NaN NaN

1
问题已更新。我会相应地更新答案。 - ThePyGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接