python json序列化对象,Python json操作

  python json序列化对象,Python json操作

  Python教程栏目介绍如何嵌套JSON

  推荐(免费):Python教程

  调用API和文档数据库将返回嵌套的JSON对象。当我们使用Python尝试将嵌套结构中的键转换为列时,在将数据加载到pandas中时,我们通常会得到以下结果:

  df=PD . data frame . from _ records(results[" issues "],columns=[" key "," fields "])说明:这里results是一个大字典,issues是results的键之一,issues的值是嵌套的JSON对象字典的列表。稍后您将看到JSON嵌套结构。问题是API返回了一个嵌套的JSON结构,但是我们关心的键在对象中处于不同的层次。

  嵌套的JSON结构就变成这样了。

  而我们想要的是下面的。

  以下面API返回的数据为例。API通常包含关于字段的元数据。让我们假设这些是我们想要的字段。

  Key:JSON key,在第一层。摘要:第二层的“字段”对象。状态:第三级位置。status目录名:在第四嵌套层。如上所述,我们选择提取的字段位于问题列表中JSON结构的四个不同嵌套级别,一个接一个。

  {

  展开 : 架构,名称,

  问题 : [

  {

  字段 : {

  问题类型 : {

  avatarId: 10300,

  描述 : ,

  id: 10005 ,

  名称 : 新功能,

  子任务:为假

  },

  状态 : {

  描述 : 已做出决议,正在等待记者核实。从这里开始,问题要么被重新打开,要么被关闭。

  id: 5 :

  名称 : 已解决:

  状态目录 : {

  颜色名称 : 绿色,

  id: 3,

  钥匙 : 完成:

  名称 : 完成:

  }

  },

  摘要 : 已恢复数据收集碎片整理$MFT问题

  },

  id: 11861 ,

  钥匙 : CAE-160 :

  },

  {

  字段 : {

  .更多问题】,

  maxResults: 5,

  从: 0开始,

  总计: 160

  }一个不太好的解决方案

  一种选择是直接编码写一个函数来寻找一个特定的字段,但问题是你必须为每个嵌套的字段调用这个函数,然后调用。应用于数据框架中的新列。

  要获得我们想要的几个字段,首先我们提取字段中的对象,这些字段是列的键:

  s="brush:php;toolbar:false">df = (

   df["fields"]

   .apply(pd.Series)

   .merge(df, left_index=True, right_index = True)

  )从上表看出,只有summary是可用的,issuetype、status等仍然埋在嵌套对象中。

  下面是提取issuetype中的name的一种方法。

  

# 提取issue type的name到一个新列叫"issue_type"

像上面这样,如果嵌套层级特别多,就需要自己手撸一个递归来实现了,因为每层嵌套都需要调用一个像上面解析并添加到新列的方法。

 

  对于编程基础薄弱的朋友,手撸一个其实还挺麻烦的,尤其是对于数据分析师,着急想用数据的时候,希望可以快速拿到结构化的数据进行分析。

  下面东哥分享一个pandas的内置解决方案。

  内置的解决方案

  pandas中有一个牛逼的内置功能叫 .json_normalize

  pandas的文档中提到:将半结构化JSON数据规范化为平面表。

  前面方案的所有代码,用这个内置功能仅需要3行就可搞定。步骤很简单,懂了下面几个用法即可。

  确定我们要想的字段,使用 . 符号连接嵌套对象。

  将想要处理的嵌套列表(这里是results["issues"])作为参数放进 .json_normalize 中。

  过滤我们定义的FIELDS列表。

  

FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"]

没错,就这么简单。

 

  其它操作

  记录路径

  除了像上面那样传递results["issues"]列表之外,我们还使用record_path参数在JSON对象中指定列表的路径。

  

# 使用路径而不是直接用results["issues"]

自定义分隔符

 

  还可以使用sep参数自定义嵌套结构连接的分隔符,比如下面将默认的“.”替换“-”。

  

### 用 "-" 替换默认的 "."

控制递归

 

  如果不想递归到每个子对象,可以使用max_level参数控制深度。在这种情况下,由于statusCategory.name字段位于JSON对象的第4级,因此不会包含在结果DataFrame中。

  

# 只深入到嵌套第二级

下面是.json_normalizepandas官方文档说明,如有不明白可自行学习,本次东哥就介绍到这里。

 

  

pandas官方文档:https://pandas.pydata.org/pan...

以上就是Python介绍嵌套 JSON 秒变 Dataframe!的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

 

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: