本文摘自php中文网,作者coldplay.xixi,侵删。
Python教程栏目介绍如何嵌套JSON推荐(免费):Python教程
调用API
和文档数据库会返回嵌套的JSON
对象,当我们使用Python
尝试将嵌套结构中的键转换为列时,数据加载到pandas
中往往会得到如下结果:
1 |
|
说明:这里results是一个大的字典,issues是results其中的一个键,issues的值为一个嵌套JSON对象字典的列表,后面会看到JSON嵌套结构。
问题在于API返回了嵌套的JSON
结构,而我们关心的键在对象中确处于不同级别。
嵌套的JSON
结构张成这样的。
而我们想要的是下面这样的。
下面以一个API返回的数据为例,API通常包含有关字段的元数据。假设下面这些是我们想要的字段。
- key:JSON密钥,在第一级的位置。
- summary:第二级的“字段”对象。
- status name:第三级位置。
- statusCategory name:位于第4个嵌套级别。
如上,我们选择要提取的字段在issues列表内的JSON
结构中分别处于4个不同的嵌套级别,一环扣一环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
一个不太好的解决方案
一种选择是直接撸码,写一个查找特定字段的函数,但问题是必须对每个嵌套字段调用此函数,然后再调用.apply
到DataFrame
中的新列。
为获取我们想要的几个字段,首先我们提取fields键内的对象至列:
1 2 3 4 5 |
|
从上表看出,只有summary是可用的,issuetype、status等仍然埋在嵌套对象中。
下面是提取issuetype中的name的一种方法。
1 2 3 4 5 6 7 |
|
像上面这样,如果嵌套层级特别多,就需要自己手撸一个递归来实现了,因为每层嵌套都需要调用一个像上面解析并添加到新列的方法。
对于编程基础薄弱的朋友,手撸一个其实还挺麻烦的,尤其是对于数据分析师,着急想用数据的时候,希望可以快速拿到结构化的数据进行分析。
下面东哥分享一个pandas
的内置解决方案。
内置的解决方案
pandas
中有一个牛逼的内置功能叫 .json_normalize
。
pandas
的文档中提到:将半结构化JSON
数据规范化为平面表。
前面方案的所有代码,用这个内置功能仅需要3行就可搞定。步骤很简单,懂了下面几个用法即可。
确定我们要想的字段,使用 . 符号连接嵌套对象。
将想要处理的嵌套列表(这里是results["issues"]
)作为参数放进 .json_normalize
中。
过滤我们定义的FIELDS列表。
1 2 3 |
|
没错,就这么简单。
其它操作
记录路径
除了像上面那样传递results["issues"]
列表之外,我们还使用record_path
参数在JSON
对象中指定列表的路径。
1 2 |
|
自定义分隔符
还可以使用sep参数自定义嵌套结构连接的分隔符,比如下面将默认的“.”替换“-”。
1 2 3 |
|
控制递归
如果不想递归到每个子对象,可以使用max_level
参数控制深度。在这种情况下,由于statusCategory.name
字段位于JSON
对象的第4级,因此不会包含在结果DataFrame
中。
1 2 |
|
下面是.json_normalize
的pandas
官方文档说明,如有不明白可自行学习,本次东哥就介绍到这里。
pandas官方文档:https://pandas.pydata.org/pan...
以上就是Python介绍嵌套 JSON 秒变 Dataframe!的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python开发tornado网站之requesthandler:输出相应函数
更多相关阅读请进入《Python》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。