如何确定仅在列的某个子集中具有NaN的行



给定一个可能有NaN值的DataFrame,我想确定哪些行有NaN作为值,但只针对某些列。

我认为以下内容应该有效。。。

my_df.query('colA.isnull() | colZ.isnull() | colN.isnull()')

然而,我遇到了以下例外

TypeError: unhashable type: 'numpy.ndarray'

现在,我已经确定可以传递参数engine='python'以使查询工作。但是,我想使用优化的引擎numexpr

这样的质疑可能吗?或者,我必须一次一列地迭代要筛选的每一列吗?

谢谢。

一种方法是构建一个布尔掩码,用于挑选满足任何条件的行。

# Method 1: build the boolean mask using bitwise operations
 mask = ((df['colA'].isnull()) |
         (df['colZ'].isnull()) | 
         (df['colN'].isnull()))
null_rows = df[mask]
# Method 2: pick desired columns from an element-wise boolean mask of null flags
mask = df.isnull()[['colA', 'colZ', 'colN']].any(axis=1)
null_rows = df[mask]

您可以对列进行切片并使用df.isna()

df(使用我今天早些时候在SO上从其他地方复制的代码生成,很抱歉我忘了在哪里,但谢谢!(:

          0         1         2         3         4
0  0.763847  1.343149  0.096778       NaN  0.532322
1 -0.364227 -0.560027       NaN       NaN       NaN
2 -0.556234  0.384970  0.476016       NaN -0.385282
3  0.604560 -0.390024 -1.697762  1.207321  0.829520
4       NaN       NaN  0.754011  2.137359 -0.594698
5  0.513925  0.651509 -1.500094       NaN -0.556604
6       NaN       NaN -1.388030       NaN       NaN
7       NaN -0.634743  0.024213 -0.439684  0.765820
8  0.815948  0.545350 -0.823986       NaN  1.655538
9  0.687386  1.477326       NaN  0.207531  0.571499

df.isna():的输出

       0      1      2      3      4
0  False  False  False   True  False
1  False  False   True   True   True
2  False  False  False   True  False
3  False  False  False  False  False
4   True   True  False  False  False
5  False  False  False   True  False
6   True   True  False   True   True
7   True  False  False  False  False
8  False  False  False   True  False
9  False  False   True  False  False

行操作:

df.isna().sum(axis=1)
0    1
1    3
2    1
3    0
4    2
5    1
6    4
7    1
8    1
9    1

按列:

df.isna().sum()
    0    3
    1    2
    2    2
    3    6
    4    2

要对df进行切片,请使用类似df.loc[:, 0:2].isna()的方法。您可以在此处阅读有关切片、.loc.iloc的信息:https://pandas.pydata.org/pandas-docs/stable/indexing.html

最新更新