La reducción de series de pandas con múltiples valores de nan a un conjunto da múltiples valores de nan

Estoy esperando a que se set([nan,0,1]) pero se 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]) 

No todos los nans son idénticos:

 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 

Por lo tanto,

 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} 

Contiene np.nan s, que son idénticos, por lo que

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

pero pd.Series(l).tolist() contiene np.float64('nan') s que no son idénticos:

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

así que el conjunto no los trata como iguales:

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

Si tiene una Serie Pandas, use su método unique lugar de set para encontrar valores únicos:

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