我在json之下,我从外部网络服务获得:
text="""
[{
"id":"1",
"name" : "abc",
"address":{
"flat":"123",
"city":"paris",
"street":null
},
"error":null
}]
现在我想从这个json创建数据帧。当我在下面尝试时:
from pandas.io.json import json_normalize
import json
import pandas as pd
resp_json = json.loads(text)
response = json_normalize(resp_json)
但是这给了我以下错误:
Error at response = json_normalize(resp_json)
KeyError : 'street'
我相信它是因为street属性的值为null,这就是它抛出此错误的原因。怎么解决这个问题?
如果我喜欢下面的内容,我能够解决,但理想情况下它不是正确的解决方案
text = text.replace('"street":null','"street":""')
注意: - 当我使用python verion 3.6.3 :: Anaconda Inc.和pandas版本0.20.3时,我没有看到这个问题,json_normalize能够正常工作。这是我的本地机器设置。
在生产机器上我们有 - Python - 3.5.1和pandas 0.23.0。我们遇到了上述问题。
答案 0 :(得分:1)
这似乎是最新版本的熊猫中的一个错误:
https://github.com/pandas-dev/pandas/issues/21158
我正在跑熊猫' 0.23.0'我可以重现同样的错误。 您可以在github讨论主题中看到,当嵌套级别上出现 null 值大于0时,由于条件情况而出现错误。似乎已经在两个月前改变了似乎已经使它成为&两周前进入0.23.0发布的方式:
除了等待新版本或降级你的生产环境(这不是一个好主意,因为它很可能会破坏),你可以想到如何在你的环境中处理多个包版本。除非您创建不同的虚拟环境,否则Pip无法这样做,我相信conda也不会。如果您真的需要加载这些文件,那么您可以做的是加载“0.22.0'打包作为一个本地模块,通过克隆它作为一个临时的,hacky解决方案 - 只是为了加载您的字典。但是当您使用0.22.0加载并尝试将其与0.23.0一起使用时,可能存在一些数据帧API不一致。
转换字符串的解决方案可能不会那么糟糕。
快乐的黑客攻击。