pandas json_normalize KeyError

时间:2018-03-11 08:59:16

标签: python json pandas

我有一个嵌套的json文件没有统一的结构,如下例所示:

[{ "name": "Jon", "last": "Jonny"}, 
 {"name": "Jimmy", "last": "johnson", "kids":[{"kidName":"johnson_junior","kidAge": "1"}, {"kidName":"johnson_junior2", "kidAge": "4"}]}]

在第二项中看到列表名称" kids"在第一项中不存在。

当我尝试使用pandas json_normalize来平放json时,抛出错误消息:" KeyError:' kids'"

这是json_normalize命令:

flat_json = json_normalize(json_file, record_path= 'kids',  errors='ignore')

似乎json_normalize不支持没有统一结构的嵌套json。

有人遇到过同样的问题吗?你对如何通过它了解吗?

1 个答案:

答案 0 :(得分:2)

如果没有太大麻烦,只要该密钥不存在,我就会添加'kids':[{'kidName':None,'kidAge':None}]

errors='ignore'用于meta中列出的密钥(请参阅docu),而您使用kids指定的密钥是记录路径

我不知道您是否要求提供一般性建议,如“如果记录路径密钥有时不可用会发生什么?”,但为了防止您提供的数据示例是您当前的问题,那就是快速修复我建议。

这样的工作:

data = {"name": "Jimmy", "last": "johnson", "kids":[{"kidName":"johnson_junior","kidAge": "1"}, {"kidName":"johnson_junior2", "kidAge": "4"}]}]

# then you inform with empty kids if looping doesn't alter your desired flow that much
[elem.update({'kids':[{'kidName':None,'kidAge':None}]}) for elem in data if 'kids' not in elem.keys()]

# finally you normalize
flat_json = json_normalize(data,'kids', ['name','last'])

输出:

kidAge          kidName   name     last
0   None             None    Jon    Jonny
1      1   johnson_junior  Jimmy  johnson
2      4  johnson_junior2  Jimmy  johnson