【问题标题】:How to avoid error on missing keys when using dict comprehension使用字典理解时如何避免丢失键的错误
【发布时间】:2018-08-11 03:28:33
【问题描述】:

如何在 pd.DataFrame.from_dict 理解迭代中忽略丢失的键?

@jezrael 在这里回答了我关于使用字典值制作 df 的问题:

https://stackoverflow.com/a/49072184/9242601

但我遇到了Key Error: 'fees' 错误,因为并非所有“客户”都有“费用”键,因此我希望迭代只移动到下一个客户而不记录该客户,而不是生成错误在df中。

我仍然需要一个数据框,所以 try... exceptif 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') - 如果不存在,则提供空的默认费用列表 - 不确定这是否适合您的数据

标签: python python-3.x pandas 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】:

链接没问题 - 它在 Stackoverflow 中,不会去任何地方。

满足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。解决了我的问题就好了
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多