2016-12-27 133 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