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
对于 NaN
s:
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
我需要查找(并删除)所有元素都大于某个常数的所有行,忽略 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
对于 NaN
s:
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