Pandas json_normalize在JSON

时间:2018-06-01 14:05:34

标签: python json python-3.x pandas

我在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。我们遇到了上述问题。

1 个答案:

答案 0 :(得分:1)

这似乎是最新版本的熊猫中的一个错误:

https://github.com/pandas-dev/pandas/issues/21158

我正在跑熊猫' 0.23.0'我可以重现同样的错误。 您可以在github讨论主题中看到,当嵌套级别上出现 null 值大于0时,由于条件情况而出现错误。似乎已经在两个月前改变了似乎已经使它成为&两周前进入0.23.0发布的方式:

https://github.com/pandas-dev/pandas/commit/01882ba5b4c21b0caf2e6b9279fb01967aa5d650#diff-9c654764f5f21c8e9d58d9ebf14de86d

除了等待新版本或降级你的生产环境(这不是一个好主意,因为它很可能会破坏),你可以想到如何在你的环境中处理多个包版本。除非您创建不同的虚拟环境,否则Pip无法这样做,我相信conda也不会。如果您真的需要加载这些文件,那么您可以做的是加载“0.22.0'打包作为一个本地模块,通过克隆它作为一个临时的,hacky解决方案 - 只是为了加载您的字典。但是当您使用0.22.0加载并尝试将其与0.23.0一起使用时,可能存在一些数据帧API不一致。

转换字符串的解决方案可能不会那么糟糕。

快乐的黑客攻击。