我有这个人.python中的字典:
OrderedDict([(30, ('A1', 55.0)), (31, ('A2', 125.0)), (32, ('A3', 180.0)), (43, ('A4', nan))])
Run Code Online (Sandbox Code Playgroud)
有没有办法删除任何值为NaN的条目?我试过这个:
{k: dict_cg[k] for k in dict_cg.values() if not np.isnan(k)}
Run Code Online (Sandbox Code Playgroud)
如果soln适用于python 2和python 3,那将会很棒
由于您有熊猫,因此您可以pd.Series.notnull在此处利用熊猫的功能,该功能可用于混合dtypes。
>>> 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)}
Run Code Online (Sandbox Code Playgroud)
这不是答案的一部分,但可以帮助您了解我是如何得出解决方案的。在尝试pd.notnull直接使用此问题时,我遇到了一些奇怪的行为。
取dict_cg[43]。
>>> dict_cg[43]
('A4', nan)
Run Code Online (Sandbox Code Playgroud)
pd.notnull 不起作用。
>>> pd.notnull(dict_cg[43])
True
Run Code Online (Sandbox Code Playgroud)
它将元组视为单个值(而不是值的可迭代)。此外,将其转换为列表然后进行测试也会给出错误的答案。
>>> pd.notnull(list(dict_cg[43]))
array([ True, True])
Run Code Online (Sandbox Code Playgroud)
由于第二个值是nan,我要寻找的结果应该是[True, False]。预转换为系列后,它终于可以工作了:
>>> pd.Series(dict_cg[43]).notnull()
0 True
1 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
因此,解决方案是对它进行系列化处理,然后测试这些值。
同样,另一种(公认的环形交叉路)解决方案是将其预转换为objectdtype numpy数组,并将pd.notnull直接运行:
>>> pd.notnull(np.array(dict_cg[43], dtype=object))
Out[151]: array([True, False])
Run Code Online (Sandbox Code Playgroud)
我想pd.notnull直接将其转换dict_cg[43]为隐藏的字符串数组,将NaN渲染为字符串“ nan”,因此不再是“ null”值。