考虑以下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}
为什么结果集中有NaN
个重复?使用类似的函数(pandas.unique
)不会产生这个结果,那么有什么区别呢?
pd.unique(s)
array([ nan, 1.])
答案 0 :(得分:3)
与Java和JavaScript一样,numpy中的nan
不等于自己。
>>> np.nan == np.nan
False
这意味着当set
构造函数检查"我在此集合中是否有nan
的实例?"它alwasy返回 False
nan
表示"值不能由' float'"表示。这意味着将其转换为float的尝试必然会失败。它也无法排序,因为无法判断nan
是否应该大于或小于任何数字。
毕竟,哪个更大" cat"还是7?是"高飞" =="冥王星"?
有几种方法可以解决此问题。就个人而言,我通常会在处理之前尝试填充 nan:DataFrame.fillna
将有助于此,我总是使用df.unique()
来获取一组唯一值。
no_nas = s.dropna().unique()
with_nas = s.unique()
with_replaced_nas = s.fillna(-1).unique() # using a placeholder
(注意:以上所有内容都可以传递给set
构造函数。
有理由不使用Pandas,或依赖本地对象而不是Pandas。这些就足够了。
您的另一个选择是过滤并删除nan
。
unqs = set(item for item in s if not np.isnan(item))
您还可以替换内联内容:
placeholder = '{placeholder}' # There are a variety of placeholder options.
unqs = set(item if not np.isnan(item) else placeholder for item in s)