2016-08-01 84 views
5

我想在数据框的几列上使用.notnull()以消除包含“NaN”值的行。在熊猫中使用.notnull()时什么是正确的语法?

让说我有以下df

A B C 
0 1 1 1 
1 1 NaN 1 
2 1 NaN NaN 
3 NaN 1 1 

我试图用这个语法,但它不工作?你知道我做错了什么吗?

df[[df.A.notnull()],[df.B.notnull()],[df.C.notnull()]] 

我得到这个错误:

TypeError: 'Series' objects are mutable, thus they cannot be hashed 

我应该怎么做才能得到下面的输出?

A B C 
0 1 1 1 

任何想法?

+2

你可以做'df.dropna(子= 'A', 'B', 'C'])' – ayhan

回答

7

您可以先通过df[['A','B','C']]选择列的子集,然后应用notnull并指定掩码中allTrue

print (df[['A','B','C']].notnull()) 
     A  B  C 
0 True True True 
1 True False True 
2 True False False 
3 False True True 

print (df[['A','B','C']].notnull().all(1)) 
0  True 
1 False 
2 False 
3 False 
dtype: bool 

print (df[df[['A','B','C']].notnull().all(1)]) 
    A B C 
0 1.0 1.0 1.0 

另一种解决方案是从dropnaAyhan评论:

print (df.dropna(subset=['A', 'B', 'C'])) 
    A B C 
0 1.0 1.0 1.0 

同样如下:

print (df.dropna(subset=['A', 'B', 'C'], how='any')) 

并表示删除所有行,其中至少有一个值为NaN

+0

感谢有意义......关于'。所有东西() “那是干什么的?以及它与'.any()'有什么不同? – MEhsan

+1

'all'表示检查所有值是否为真,并且'any'表示检查至少一个值是否为真。如果使用'all(1)'或'any(1)',这意味着检查行,因为它与'all(axis = 1)'或'any(axis = 1)相同' – jezrael

+0

您真棒!非常感谢我的朋友 – MEhsan

1

您可以通过将它们与&运算符结合使用来应用多个条件(这不仅适用于notnull()函数)。

df[(df.A.notnull() & df.B.notnull() & df.C.notnull())] 
    A B C 
0 1.0 1.0 1.0 

或者,你能把它包含NaN所有列。原始DataFrame未被修改,而是返回一个副本。

df.dropna()

相关问题