【发布时间】:2018-05-31 20:57:56
【问题描述】:
考虑以下pandas.Series:
import pandas as pd
import numpy as np
s = pd.Series([np.nan, 1, 1, np.nan])
s
0 NaN
1 1.0
2 1.0
3 NaN
dtype: float64
我想使用内置的set 函数仅查找此特定系列中的唯一值:
unqs = set(s)
unqs
{nan, 1.0, nan}
为什么结果集中有重复的NaNs?使用类似的函数 (pandas.unique) 不会产生这个结果,那么这里有什么区别呢?
pd.unique(s)
array([ nan, 1.])
【问题讨论】:
-
因为在 Python 中
math.nan != math.nan。这是对等式关系应该具有的 reflexivity 契约的违反之一,但这里有充分的理由这样做。 -
这有什么特别的设计原因吗?这种比较的结果是不直观的。
-
不仅不直观,甚至违反了自反性约束。原因是比如
math.nan + 2也是math.nan,但是你能说x + 2 == x吗? -
请在使用 pandas 时使用
s.unique()或s.value_counts()。