将具有多个 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.nan
s,它们是相同的,所以
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 值的列名并将这些列名存储在列表中? [复制]