2016-12-27 52 views
3

我假定比較np.nan和ISNULL之間的差值()

data[data.agefm.isnull()] 

data[data.agefm == numpy.nan] 

是等價的。但是,不,第一個真正返回agefm是NaN的行,但第二個返回空的DataFrame。我感謝省略的值總是等於np.nan,但它似乎是錯誤的。

agefm列有float64類型:

(Pdb) data.agefm.describe() 
count 2079.000000 
mean  20.686388 
std   5.002383 
min  10.000000 
25%  17.000000 
50%  20.000000 
75%  23.000000 
max  46.000000 
Name: agefm, dtype: float64 

你能解釋我請,什麼是data[data.agefm == np.nan]意味着什麼呢?

+0

認爲你應該使用'np.isnan'。 – Divakar

+1

他們是不一樣的:http://stackoverflow.com/questions/20320022/why-in-numpy-nan-nan-is-false-while-nan-in-nan-is-true – ayhan

+0

@Divakar因此,如果我應該,這是熊貓的缺陷嗎?或者我犯了一個概念錯誤? – sergzach

回答

4

np.nan直接與np.nan ...沒有可比性。

np.nan == np.nan 

False 

雖然

np.isnan(np.nan) 

True 

也可以做

pd.isnull(np.nan) 

True 

例子
過濾器沒有因爲沒有什麼是等於np.nan

s = pd.Series([1., np.nan, 2.]) 
s[s != np.nan] 

0 1.0 
1 NaN 
2 2.0 
dtype: float64 

篩選出空

s = pd.Series([1., np.nan, 2.]) 
s[s.notnull()] 

0 1.0 
2 2.0 
dtype: float64 

使用比較古怪行爲來得到我們想要反正。如果np.nan != np.nanTrue然後

s = pd.Series([1., np.nan, 2.]) 
s[s == s] 

0 1.0 
2 2.0 
dtype: float64 

只是dropna

s = pd.Series([1., np.nan, 2.]) 
s.dropna() 

0 1.0 
2 2.0 
dtype: float64 
+0

'np.isnan'和'pd.isnull'是否相同? – sergzach

+0

@sergzach不,但接近。我相信'pd.isnull'檢查了一些null的東西。 – piRSquared

+3

@sergzach是'NaN',而不是'None'。你不能使用'np.isnan'作爲對象數組。 – ayhan