当我在Python中使用numpy
和pandas
进行某些集合操作时,遇到了一个奇怪的现象,我认为这会导致nan
中的不一致处理。
让我们假设我们有一个非常简单的情况,即以集合为我们的兴趣点:
import numpy as np
import pandas as pd
a = {1, 2, 3, np.nan}
b = {1, 2, 4, np.nan}
print(a - b)
出局:
{3}
这很好,我们希望是这样,但是让我们继续一些更复杂的示例,其中包括pandas
系列/数据帧:
series = pd.Series([1, 2, 3, np.nan, 1, 2, 3])
d = set(series)
print(d)
出局:
{nan, 1.0, 2.0, 3.0}
再一次,很好。不过,当我们打电话时:
print(d - b) # the same applies to a single column of a data frame in place of a series
结果是(对我来说出乎意料):
{nan, 3.0}
输出中仍然有一个nan
值。
我确实知道,当我们创建series
变量时,所有输入值都在幕后强制转换为float64
格式,包括nan
值。
type(series.iloc[3])
出局:
numpy.float64
自由创建的np.nan
的类型仅为float
。当然,两种情况下的np.isnan()
函数都将返回True
。我仍然认为这是不一致的,因为我假设所有基本的Python操作(无疑是set操作所属的Python操作)将以与数字相似的方式对待nan
。即使对集合中的数字应用了与nan
相同的类型转换(在纯Python中,它们是int
,而在pandas
系列中,它们是{{1 }}},设置操作仍将它们视为相同的实体,并充分删除值。 float
应该也是(准)数字,但处理方式有所不同。是由于某种原因无法解决的功能,错误或已确认的情况?
Python版本:3.6.6。 numpy版本:1.16.2。 熊猫版本:0.24.2。