Python set 不会删除重复的 NaN

问题描述 投票:0回答:1

set()
应用于包含多个 NaN 值的列表通常会删除重复的 NaN 条目。

示例

set([np.nan, 5, np.nan, 17, 5, np.nan, 23])

产量:

{5, 17, nan, 23}

但是,我现在有一个列表,该列表源自对数据帧的列中包含的不同列表进行求和(连接);其中一些列表包含 NaN。当我将

set()
应用于从 检索的串联列表时,它不会删除重复的 NaN。请看下面的截图:

enter image description here

屏幕截图中的对象

a1
肯定是
list
类型。我不确定,但也许这取决于 NaN 是否在 numpy 数组(或 pandas 数据帧,大概)中的某个点:

  • set([np.nan, np.nan, np.nan])
    产量
    {nan}
  • set(np.array([np.nan, np.nan]))
    产量
    {nan, nan, nan}
  • set(list(np.array([np.nan, np.nan])))
    产量
    {nan, nan, nan}

除了

np.unique()
pd.unique()
之外,还有什么方法可以避免这种情况?为什么
set()
会有这样的行为(我假设预期的默认值是删除重复的 NaN,即使 NaN != NaN!)?

python pandas set nan
1个回答
0
投票

除了

np.unique()
pd.unique()
之外,还有什么方法可以避免这种情况?

numpy.nan_to_num
可能有用,因为

NaN 被零或 nan 关键字中的用户定义值替换

在您的情况下,只需提供永远不会出现在您的数据中的值并将其从集合中删除,例如如果你的所有值都是非负的,你可以使用 -1.0 来这样做

import numpy as np
arr = np.array([0.0, np.nan, 2.1, np.nan, 5.7, np.nan])
s = set(np.nan_to_num(arr, nan=-1.0))
print(s)  # {0.0, 2.1, 5.7, -1.0} where -1.0 denotes nan
© www.soinside.com 2019 - 2024. All rights reserved.