Pandas 中的布尔切片忽略 NaN

Ignore NaN in Boolean slicing in Pandas

我需要查找(并删除)所有元素都大于某个常数的所有行,忽略 NaN 值:

In[23]: df
Out[23]:
0     1     2     3     4
290   4.0  16.0  18.0  12.0   8.0
291  16.0  18.0  12.0   8.0   9.0
292  18.0  12.0   8.0   9.0   9.0
293  12.0   8.0   9.0   9.0  15.0
294   8.0   9.0   9.0  15.0  18.0
295   9.0   9.0  15.0  18.0  18.0
296   9.0  15.0  18.0  18.0  16.0
297  15.0  18.0  18.0  16.0  20.0
298  18.0  18.0  16.0  20.0   NaN
299  18.0  16.0  20.0   NaN  16.0
300  16.0  20.0   NaN  16.0  14.0
301  20.0   NaN  16.0  14.0   NaN
302   NaN  16.0  14.0   NaN  16.0
303  16.0  14.0   NaN  16.0  15.0
304  14.0   NaN  16.0  15.0  15.0
305   NaN  16.0  15.0  15.0  12.0
306  16.0  15.0  15.0  12.0  16.0
307  15.0  15.0  12.0  16.0  15.0
308  15.0  12.0  16.0  15.0  14.0
309  12.0  16.0  15.0  14.0  17.0

通过做天真:

In[24]:df>10
Out[24]: 
         0      1      2      3      4
290  False   True   True   True  False
291   True   True   True  False  False
292   True   True  False  False  False
293   True  False  False  False   True
294  False  False  False   True   True
295  False  False   True   True   True
296  False   True   True   True   True
297   True   True   True   True   True
298   True   True   True   True  False
299   True   True   True  False   True
300   True   True  False   True   True
301   True  False   True   True  False
302  False   True   True  False   True
303   True   True  False   True   True
304   True  False   True   True   True
305  False   True   True   True   True
306   True   True   True   True   True
307   True   True   True   True   True
308   True   True   True   True   True
309   True   True   True   True   True

由于 NaN is not > 10 的事实而错过了几个合法的行,因此给出了 False

我需要删除第 297-309 行。如何修改布尔索引以忽略 NaN 值?

您需要 or 使用按位 | 布尔条件和 isnull,另外由于运算符优先级而使用括号作为条件:

In [326]:
(df > 10) | (df.isnull())

Out[326]:
         0      1      2      3      4
290  False   True   True   True  False
291   True   True   True  False  False
292   True   True  False  False  False
293   True  False  False  False   True
294  False  False  False   True   True
295  False  False   True   True   True
296  False   True   True   True   True
297   True   True   True   True   True
298   True   True   True   True   True
299   True   True   True   True   True
300   True   True   True   True   True
301   True   True   True   True   True
302   True   True   True   True   True
303   True   True   True   True   True
304   True   True   True   True   True
305   True   True   True   True   True
306   True   True   True   True   True
307   True   True   True   True   True
308   True   True   True   True   True
309   True   True   True   True   True

使用 isnull| (or):

mask = (df>10) | df.isnull()
#alternatively
#mask = (df.gt(10)) | df.isnull()
print (mask)
         0      1      2      3      4
290  False   True   True   True  False
291   True   True   True  False  False
292   True   True  False  False  False
293   True  False  False  False   True
294  False  False  False   True   True
295  False  False   True   True   True
296  False   True   True   True   True
297   True   True   True   True   True
298   True   True   True   True   True
299   True   True   True   True   True
300   True   True   True   True   True
301   True   True   True   True   True
302   True   True   True   True   True
303   True   True   True   True   True
304   True   True   True   True   True
305   True   True   True   True   True
306   True   True   True   True   True
307   True   True   True   True   True
308   True   True   True   True   True
309   True   True   True   True   True

它 return True 对于 NaNs:

print (df.isnull())
         0      1      2      3      4
290  False  False  False  False  False
291  False  False  False  False  False
292  False  False  False  False  False
293  False  False  False  False  False
294  False  False  False  False  False
295  False  False  False  False  False
296  False  False  False  False  False
297  False  False  False  False  False
298  False  False  False  False   True
299  False  False  False   True  False
300  False  False   True  False  False
301  False   True  False  False   True
302   True  False  False   True  False
303  False  False   True  False  False
304  False   True  False  False  False
305   True  False  False  False  False
306  False  False  False  False  False
307  False  False  False  False  False
308  False  False  False  False  False
309  False  False  False  False  False