【问题标题】:Python's 'set' operator doesn't work with numpy.nanPython 的“设置”运算符不适用于 numpy.nan
【发布时间】:2018-04-01 05:58:15
【问题描述】:

我注意到将 NaN 值列表转换为集合时出现问题:

import pandas as pd
import numpy as np

x = pd.DataFrame({'a':[None,None]})
x_numeric = pd.to_numeric(x['a']) #converts to numpy.float64
set(x_numeric)

这应该返回 {nan} 而是返回 {nan, nan}。但是,这样做:

set([numpy.nan, numpy.nan])

返回预期的 {nan}。前者显然是类 numpy.float64,而后者默认是类 float。

知道为什么 set() 不适用于 numpy.float64 NaN 值吗?我使用的是 Pandas 0.18 版和 Numpy 1.10.4 版。

【问题讨论】:

  • 在 numpy 中,两个 nan 不相等。在列表中,它们可能相同,但在 numpy 数组中不同。要找出答案,请尝试set(np.array([np.nan,np.nan]))。在 pandas 中,它们的系列将采用 numpy 数组格式
  • x_numeric.unique() 只返回[nan],这很有趣。
  • 好吧,我现在有点困惑了。
  • @cᴏʟᴅsᴘᴇᴇᴅ 这解决了我的直接问题,谢谢!奇怪的是 np.unique(x_numeric) 仍然返回 {nan, nan}。
  • @AndyHayden 我明白了!也感谢您的回答,它非常有用。看看你是否也可以回答mine.. :-)

标签: python pandas numpy nan


【解决方案1】:

Numpy 在这里是一个红鲱鱼 - np.nan 只是 float('nan') 的名称,这表明了同样的问题:

>>> a = float('nan')
>>> b = float('nan')
>>> {a, b}
{nan, nan}
>>> {a, a}
{nan}

正如 Andy 所说,这是关于在检查集合成员资格时在 x == y 之前尝试 x is y 的集合相等性。

【讨论】:

    【解决方案2】:

    float64 数组中的 NaN 不指向与 np.NaN 相同的内存空间(它们与数组中的所有其他数字一样,在数组中为 8 个字节)。当我们采取id时可以看到这一点:

    In [11]: x_numeric
    Out[11]:
    0   NaN
    1   NaN
    Name: a, dtype: float64
    
    In [12]: x_numeric.apply(id)
    Out[12]:
    0    4657312584
    1    4657312536
    Name: a, dtype: int64
    
    In [13]: id(np.nan)
    Out[13]: 4535176264
    
    In [14]: id(np.nan)
    Out[14]: 4535176264
    

    发生这种情况有点像python“陷阱”,因为它是一种优化(在检查集合相等性之前,python 检查它是否是同一个对象:在内存中具有相同的id/位置):

    In [21]: s = set([np.nan])
    
    In [22]: np.nan in s
    Out[22]: True
    
    In [23]: x_numeric.apply(lambda x: x in s)
    Out[23]:
    0    False
    1    False
    Name: a, dtype: bool
    

    它是一个“陷阱”的原因是因为 NaN,不像大多数对象不等于它自己:

    In [24]: np.nan == np.nan
    Out[24]: False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-04
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2018-02-24
      • 2018-08-20
      相关资源
      最近更新 更多