首页 > 解决方案 > 删除python字典中具有nan值的条目

问题描述

我知道了。python中的字典:

OrderedDict([(30, ('A1', 55.0)), (31, ('A2', 125.0)), (32, ('A3', 180.0)), (43, ('A4', nan))])

有没有办法删除任何值为 NaN 的条目?我试过这个:

{k: dict_cg[k] for k in dict_cg.values() if not np.isnan(k)}

如果soln适用于python 2和python 3,那就太好了

标签: pythondictionary

解决方案


由于您有 pandas,因此您可以pd.Series.notnull在此处利用 pandas 的功能,该功能适用​​于混合 dtype。

>>> import pandas as pd
>>> {k: v for k, v in dict_cg.items() if pd.Series(v).notna().all()}
{30: ('A1', 55.0), 31: ('A2', 125.0), 32: ('A3', 180.0)}

这不是答案的一部分,但可以帮助您了解我是如何得出解决方案的。在尝试直接使用解决这个问题时,我遇到了一些奇怪的行为pd.notnull

dict_cg[43]

>>> dict_cg[43]
('A4', nan)

pd.notnull不起作用。

>>> pd.notnull(dict_cg[43])
True

它将元组视为单个值(而不是值的可迭代)。此外,将其转换为列表然后进行测试也会给出不正确的答案。

>>> pd.notnull(list(dict_cg[43]))
array([ True,  True])

由于第二个值是nan,我正在寻找的结果应该是[True, False]。当您预先转换为系列时,它终于起作用了:

>>> pd.Series(dict_cg[43]).notnull() 
0     True
1    False
dtype: bool

因此,解决方案是对其进行系列化,然后测试这些值。

沿着类似的思路,另一个(公认的迂回)解决方案是预先转换为objectdtype numpy 数组,并将pd.notnull直接工作:

>>> pd.notnull(np.array(dict_cg[43], dtype=object))
Out[151]: array([True,  False])

我想在幕后pd.notnull直接转换dict_cg[43]为字符串数组,将 NaN 呈现为字符串“nan”,因此它不再是“null”值。


推荐阅读