将具有多个 nan 值的 pandas 系列减少到一个集合会给出多个 nan 值

Posted

技术标签:

【中文标题】将具有多个 nan 值的 pandas 系列减少到一个集合会给出多个 nan 值【英文标题】:Reducing pandas series with multiple nan values to a set gives multiple nan values 【发布时间】:2014-12-02 11:05:04 【问题描述】:

我期待收到set([nan,0,1]),但我收到set([nan, 0.0, nan, 1.0])

>>> import numpy as np
>>> import pandas as pd
>>> l= [np.nan,0,1,np.nan]
>>> set(pd.Series(l))
set([nan, 0.0, nan, 1.0])
>>> set(pd.Series(l).tolist())
set([nan, 0.0, nan, 1.0])
>>> set(l)
set([nan, 0, 1])

【问题讨论】:

您是在询问意外行为,还是只想使用 pandas 实现目标?你可以做set(pd.Series(l).unique().to_list()),应该工作 【参考方案1】:

并非所有的 nan 都是相同的:

In [182]: np.nan is np.nan
Out[182]: True

In [183]: float('nan') is float('nan')
Out[183]: False

In [184]: np.float64('nan') is np.float64('nan')
Out[184]: False

因此,

In [178]: set([np.nan, np.nan])
Out[178]: nan

In [179]: set([float('nan'), float('nan')])
Out[179]: nan, nan

In [180]: set([np.float64('nan'), np.float64('nan')])
Out[180]: nan, nan

l 包含np.nans,它们是相同的,所以

In [158]: set(l)
Out[158]: nan, 0, 1

pd.Series(l).tolist() 包含不完全相同的np.float64('nan')s:

In [160]: [type(item) for item in pd.Series(l).tolist()]
Out[160]: [numpy.float64, numpy.float64, numpy.float64, numpy.float64]

所以 set 不会将它们视为平等:

In [157]: set(pd.Series(l).tolist())
Out[157]: nan, 0.0, nan, 1.0

如果您有 Pandas 系列,请使用 unique 方法而不是 set 来查找唯一值:

>>> s = pd.Series(l)
>>> s.unique()
array([ nan,   0.,   1.])

【讨论】:

以上是关于将具有多个 nan 值的 pandas 系列减少到一个集合会给出多个 nan 值的主要内容,如果未能解决你的问题,请参考以下文章

查找具有 NaN 值的 DataFrame 列表的索引 - Pandas

Pandas 中具有 NaN 值的子集列

如何使用 PANDAS 获取具有 NAN 值的列名并将这些列名存储在列表中? [复制]

Pandas 将具有多个值的行数据合并到列的 Python 列表中

将列表中具有零值的多个列添加到 Pandas 数据框中

如何将 Pandas 系列中的连续 NaN 值分组到一组切片中?