使用字典理解时如何避免丢失键的错误
Posted
技术标签:
【中文标题】使用字典理解时如何避免丢失键的错误【英文标题】:How to avoid error on missing keys when using dict comprehension 【发布时间】:2018-08-11 03:28:33 【问题描述】:如何在 pd.DataFrame.from_dict
理解迭代中忽略丢失的键?
@jezrael 在这里回答了我关于使用字典值制作 df 的问题:
https://***.com/a/49072184/9242601
但我遇到了Key Error: 'fees'
错误,因为并非所有“客户”都有“费用”键,因此我希望迭代只移动到下一个客户而不记录该客户,而不是生成错误在df中。
我仍然需要一个数据框,所以 try... except
和 if key in dict
不起作用,因为我最终会得到一个空(或不存在)的 df。
很抱歉将这个问题有效地传播到两个问题上,但我认为不值得重复完整的初始问题(因此链接)。
谢谢。
【问题讨论】:
if key in dct
或 k: dict(v.get('fees')) for k, v in d.items()
如果您不介意将 None
存储为缺少密钥的项目的值。
或df = pd.DataFrame.from_dict(k: .setdefault('fees', v.get('fees',[])) for k, v in d.items(), orient='index')
- 如果不存在,则提供空的默认费用列表 - 不确定这是否适合您的数据
Check if a given key already exists in a dictionary的可能重复
【参考方案1】:
有几种不同的方法可以解决这个问题。
一种方法是使用try
except
语句来捕获错误。
另一种方法是测试密钥在字典key in dict
中。
另一个是使用dict的get方法dict.get(key, default = None)
,如果找不到该值,默认选项将返回None,或者您可以将其设置为您需要的。
【讨论】:
对 3 个 ppls cmets 进行了很好的总结,在您的“答案”之前发布了 4 分钟以上... 我没有看到有人在 cmets 中提到 try except 或 get 方法 这可能是因为在df2 = pd.DataFrame.fro...
语句周围创建 try ... catch
会使您的数据为零 - 它根本不会创建任何 Dataframe ...【参考方案2】:
链接没问题 - 它在 *** 中,不会去任何地方。
满足dict.get
方法。作为序言,这几乎是您需要了解的所有内容:
>>> d = 'present': 'real_value'
>>> d.get('present')
'real_value'
>>> d.get('absent') is None
True
>>> d.get('absent', 'default')
'default'
你应该发现修改后的理解
k: dict(v['fees']) for k, v in d.items() if v.get('fees') is not None
满足您的需求,但这是未经测试的代码。可能更具可读性是
k: dict(v['fees']) for k, v in d.items() if 'fees' in v
【讨论】:
感谢holdenweb。解决了我的问题就好了以上是关于使用字典理解时如何避免丢失键的错误的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何在遍历字典列表时处理丢失的键? [复制]