2016-08-01 65 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()