从集合中删除NaN值

时间:2016-05-10 19:52:19

标签: python

是否可以轻松删除Python Set对象的NaN值?鉴于NaN值不等于任何值(并且float('nan') is float('nan')也是False),您最终可以在Set中获得许多NaN值。

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

我能想出最好的定义像math.isnan这样的函数,但是它可以容忍非浮点类型,如:

def my_isnan(x):
    try:
        return math.isnan(x)
    except TypeError:
        return False

然后你可以使用这样的集合理解:

>>> {x for x in a if not my_isnan(x)}
{'a'}

5 个答案:

答案 0 :(得分:12)

在实践中,您可以将nan != nan视为一项功能而不是错误:

>>> a = {float('nan'), float('nan'), 'a'}
>>> a
{nan, nan, 'a'}
>>> {x for x in a if x==x}
{'a'}

从积极的方面来说,不需要辅助功能。从消极方面来说,如果你的非纳米物体也不等于它本身,那么你也会将其删除。

答案 1 :(得分:2)

您也可以使用filter

In[75]: a = set((float('nan'), float('nan'), 'a'))

In[76]: set(filter(lambda x: x == x , a))
Out[76]: {'a'}

答案 2 :(得分:1)

使用熊猫中的pd.notna(),例如:

In [219]: import pandas as pd

In [220]: a = set((float('nan'), float('nan'), 'a'))

In [221]: a = {x for x in a if pd.notna(x)}

In [222]: a
Out[222]: {'a'}

答案 3 :(得分:0)

我们可以简单地使用.remove()方法

In[1]: a = set([np.nan, "A"])
In[2]: a
Out: {'A', nan}
In[3]: a.remove(np.nan)
In[4]: a
Out: {'A'}

答案 4 :(得分:-1)

如果集合中没有nan值,则将引发错误。 改用 $measures = Measure::where('operation_id', $operation->name) ->whereBetween('time', [$from, $to]) ->select(['time AS timestamp', 'meter_id AS usage_point_id', 'repartition_rate AS key']) ->get()->groupBy('timestamp');