python - 删除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,那就太好了
解决方案
由于您有 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
因此,解决方案是对其进行系列化,然后测试这些值。
沿着类似的思路,另一个(公认的迂回)解决方案是预先转换为object
dtype 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”值。
推荐阅读
- ruby-on-rails - 在我的 Rails 应用程序中,Less::Error `unmatched '/*'`/ Sass::SyntaxError 的原因
- python - PyCharm(Python)中的Selenium代码运行缓慢,如何提高速度?
- excel - Excel 自动将带有单元格编辑历史的注释同时添加到多个单元格
- android - 如何将多个图像视图中的图像上传到 Firebase?
- c# - 为什么在 C# 中使用 DateTimeProvider 接口
- vba - 使用 vba 从主工作簿复制的工作表中重命名或添加宏到模块
- python-3.x - 我可以做些什么来让我的网络爬虫看起来更好吗?
- python - 获取“ConnectionError:Error 10054 ...”只是为了触摸具有并行处理的数据帧(Ray)
- python - 在 Pandas 中为 Sankey 重新格式化数据集
- php - 为什么 exec 打开一个文件而不是执行它?