与np.nan和isnull()的比较之间的区别

ser*_*ach 12 python numpy pandas

我想是的

data[data.agefm.isnull()]
Run Code Online (Sandbox Code Playgroud)

data[data.agefm == numpy.nan]
Run Code Online (Sandbox Code Playgroud)

是等价的.但不,第一个真正返回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
Run Code Online (Sandbox Code Playgroud)

你能解释一下,具体data[data.agefm == np.nan]意味着什么?

piR*_*red 16

np.nan不能np.nan直接与...... 相比.

np.nan == np.nan

False
Run Code Online (Sandbox Code Playgroud)

np.isnan(np.nan)

True
Run Code Online (Sandbox Code Playgroud)

也可以

pd.isnull(np.nan)

True
Run Code Online (Sandbox Code Playgroud)

示例不
过滤,因为没有任何东西等于np.nan

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

0    1.0
1    NaN
2    2.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

过滤掉null

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

0    1.0
2    2.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

使用奇怪的比较行为来获得我们想要的东西.如果np.nan != np.nan是的True

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

0    1.0
2    2.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

只是 dropna

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

0    1.0
2    2.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

  • @sergzach适用于`NaN`,不适用于`None`.您不能将`np.isnan`用于对象数组. (4认同)