【问题标题】:Inexplicable key error using pandas normalize method使用 pandas normalize 方法的莫名其妙的键错误
【发布时间】:2023-03-21 09:13:01
【问题描述】:

以下代码

import pandas as pd

dic = {'_id': '5436e3abbae478396759f0cf', 'meta': {'clinical': {'benign_malignant': 'benign', 'age_approx': 55, 'sex': 'female', 'diagnosis': 'nevus', 'diagnosis_confirm_type': None, 'anatom_site_general': 'anterior torso', 'melanocytic': True}, 'acquisition': {'image_type': 'dermoscopic', 'pixelsX': 1022, 'pixelsY': 767}}, 'name': 'ISIC_0000000'}

frame = pd.io.json.json_normalize(dic)

抛出一个

KeyError: 'diagnosis_confirm_type'

我使用的是熊猫版0.23.0。该代码在版本0.22.0 中可以正常工作。

更新:

显然,0.23.0 中确实存在导致此问题的错误。见https://github.com/pandas-dev/pandas/pull/21164

【问题讨论】:

  • 听起来像 re.sub()。尽管使用 json 库( json.dump() / json.dumps() )也可能有所帮助。
  • 好的,如果从文件中加载,文件确实包含有效的 json 字符串。 json 模块成功地将其转换为 Python dict 对象,其中所有键都是字符串,值是字符串、整数、布尔值、无或其他 dict。如果你想把它作为一个json字符串打印回来,首先将它转换成json:print(json.dumps(jsonObject))
  • 即使您将打印的对象输入到 pd.io.json.json_normalize(object) 中也不行?
  • 查看 pandas 版本的更新问题
  • 宾果游戏,现在我可以重现它了 :)。在 0.22.0 和 0.23.0 之间发生了一些变化。我必须非常感谢您花时间将其转为minimal reproducible example 和明确的问题陈述。

标签: python json pandas normalization


【解决方案1】:

如果您最初将其作为字符串获取,则您甚至不需要正则表达式:

validPJson = [line.replace('None', '"None"').replace('True', '"True"') for line in invalidJsonObjects]

查看这里为什么它比正则表达式更好:Use Python's string.replace vs re.sub

编辑:从 cmets 我了解到您的问题是加载该格式的文件而没有先修复它,这就是为什么您在加载时遇到错误(顺便说一句,这些错误确实应该在您的问题中,否则您'只是让很多试图提供帮助的人感到困惑)。

我的建议,先用类似的方法修复文件:

with open(pathToFile, 'r') as fp:
    contents = fp.read()
with open(pathToFile, 'w') as fp:
    fp.write(contents.replace('None', '"None"').replace('True', '"True"'))

只有在此之后尝试使用json 读取文件,看看是否有效

【讨论】:

  • @Sraw 这不是原始 json,他基本上是从文本文件中获取的,至少我是这么理解的
  • 他认为的无效json字符串其实是json.load反序列化的python对象。如果他真的将其读取为原始字符串,则应该是字符串中的nulltrue。请参阅问题下的第六条评论。
  • 也许我错了,但同样的用户几分钟前问了另一个问题,为什么他不能从不包含这些引号的字符串中json.loads。我认为他在这里解释得不够好
  • 那是因为在修复文件内容之前你还在尝试做loads,我建议你先修复文件,将它保存为可以被负载读取的正确json(这个答案应该帮助你做到这一点)
  • @IljaEverilä 你是对的,我已经更新了答案以反映这一点
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
相关资源
最近更新 更多