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

时间:2018-11-14 01:48:20

标签: python pandas

给出一个带有可能的NaN值的DataFrame,我想确定哪些行具有NaN作为值,但仅适用于某些列。

我相信以下方法应该有效...

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

但是,我遇到以下异常

TypeError: unhashable type: 'numpy.ndarray'

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

这样的查询可能吗?还是我必须一次遍历要过滤的每一列?

谢谢。

2 个答案:

答案 0 :(得分:0)

一种方法是构建一个布尔掩码,以选择满足您的任何条件的行。

# 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]

答案 1 :(得分:0)

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

df(使用我今天早些时候从其他地方复制的代码生成,抱歉,我忘记了,但是谢谢!):

          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()的方法。您可以在https://pandas.pydata.org/pandas-docs/stable/indexing.html

上阅读切片,.loc.iloc