在Pandas中的布尔切片中忽略NaN

时间:2017-04-28 10:29:57

标签: pandas boolean slice nan

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

2 个答案:

答案 0 :(得分:2)

您需要or使用|布局条件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 ,并且由于运算符优先级而使用括号作为条件:

 namespace go a.a1   // whatever you need, but exactly one per IDL file

答案 1 :(得分:1)

 for 1500 numbers: ormask = (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 ):

一起使用
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
SELECT CASE 
WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN '<1 Month'
WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN '1 - 2 Months'
WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN '3 - 4 Months'
ELSE '>4 Months' END AS `Length`, 
COUNT(DISTINCT(person.ID)) AS `COUNT`
FROM person
INNER JOIN opportunity AS o
INNER JOIN Organization AS org
ON person.EntityID = o.id 
    AND O.OrganizationID = Org.ID
WHERE person.TitleID = 2
AND o.bID = 1
GROUP BY `Length`
ORDER BY `Length` ASC;