最新公告
  • 欢迎您光临吆喝资源网,本站提供站长亲测的网站源码下载,打造专业的源码网!立即加入我们
  • Python介绍嵌套 JSON 秒变 Dataframe!

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

    推荐(免费):Python教程

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

    df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])

    说明:这里results一个大的字典,issues是results其中的一个键,issues的值为一个嵌套JSON对象字典的列表,后面会看到JSON嵌套结构。

    问题在于API返回了嵌套的JSON结构,而我们关心的键在对象中确处于不同级别。

    嵌套的JSON结构张成这样的。

    而我们想要的是下面这样的。

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

    • key:JSON密钥,在第一级的位置。
    • summary:第二级的“字段”对象。
    • status name:第三级位置。
    • statusCategory name:位于第4个嵌套级别。

    如上,我们选择要提取的字段在issues列表内的JSON结构中分别处于4个不同的嵌套级别,一环扣一环。

    {
      "expand": "schema,names",
      "issues": [
        {
          "fields": {
            "issuetype": {
              "avatarId": 10300,
              "description": "",
              "id": "10005",
              "name": "New Feature",
              "subtask": False
            },
            "status": {
              "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.",
              "id": "5",
              "name": "Resolved",
              "statusCategory": {
                "colorName": "green",
                "id": 3,
                "key": "done",
                "name": "Done",
              }
            },
            "summary": "Recovered data collection Defraglar $MFT problem"
          },
          "id": "11861",
          "key": "CAE-160",
        },
        {
          "fields": { 
    ... more issues],
      "maxResults": 5,
      "startAt": 0,
      "total": 160
    }

    一个不太好的解决方案

    一种选择是直接撸码,写一个查找特定字段的函数,但问题是必须对每个嵌套字段调用此函数,然后再调用.applyDataFrame中的新列。

    为获取我们想要的几个字段,首先我们提取fields键内的对象至列:

    df = (
        df["fields"]
        .apply(pd.Series)
        .merge(df, left_index=True, right_index = True)
    )

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

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

    # 提取issue type的name到一个新列叫"issue_type"
    df_issue_type = (
        df["issuetype"]
        .apply(pd.Series)
        .rename(columns={"name": "issue_type_name"})["issue_type_name"]
    )
    df = df.assign(issue_type_name = df_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"]
    df = pd.json_normalize(results["issues"])
    df[FIELDS]

    没错,就这么简单。

    其它操作

    记录路径

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

    # 使用路径而不是直接用results["issues"]
    pd.json_normalize(results, record_path="issues")[FIELDS]

    自定义分隔符

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

    ### 用 "-" 替换默认的 "."
    FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"]
    pd.json_normalize(results["issues"], sep = "-")[FIELDS]

    控制递归

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

    # 只深入到嵌套第二级
    pd.json_normalize(results, record_path="issues", max_level = 2)

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

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

    以上就是Python介绍嵌套 JSON 秒变 Dataframe!的详细内容,更多请关注吆喝资源网其它相关文章!

    本文转自PHP中文网,吆喝网(http://yaoohe.com)搜集整理,如有疑问请联系本站客服!

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"yaoohe.com",如遇到无法解压的请联系管理员!
    8. 特别声明:本站源码除标明“已测试”外,其它都未测试,有BUG概本站概不负责。
    吆喝资源网 » Python介绍嵌套 JSON 秒变 Dataframe!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    吆喝资源网
    一个高级程序员模板开发平台

    发表评论

    • 6764会员总数(位)
    • 19292资源总数(个)
    • 60本周发布(个)
    • 0 今日发布(个)
    • 1823稳定运行(天)

    专业的网站源码网,提供精品php网站源码下载,小程序源码下载等!!

    小程序源码 了解详情
    升级SVIP尊享更多特权立即升级