为了账号安全,请及时绑定邮箱和手机立即绑定

将深度嵌套的 JSON 响应从 API 调用转换为 Pandas 数据帧

将深度嵌套的 JSON 响应从 API 调用转换为 Pandas 数据帧

料青山看我应如是 2021-12-09 15:43:46
我目前在解析来自 HTTP API 调用的深层嵌套 JSON 响应时遇到问题。我的 JSON 响应就像{'took': 476, '_revision': 'r08badf3', 'response': {'accounts': {'hits': [{'name': '4002238760',     'display_name': 'Googleglass-4002238760',     'selected_fields': ['Googleglass',      'DDMonkey',      'Papu New Guinea',      'Jonathan Vardharajan',      '4002238760',      'DDMadarchod-INSTE',      None,      'Googleglass',      '0001012556',      'CC',      'Setu Non Standard',      '40022387',      320142,      4651321321333,      1324650651651]},    {'name': '4003893720',     'display_name': 'Swift-4003893720',     'selected_fields': ['Swift',      'DDMonkey',      'Papu New Guinea',      'Jonathan Vardharajan',      '4003893720',      'DDMadarchod-UPTM-RemotexNBD',      None,      'S.W.I.F.T. SCRL',      '0001000110',      'SE',      'Setu Non Standard',      '40038937',      189508,      1464739200000,      1559260800000]},收到响应后,我使用 json normalize 将其存储在数据对象中data = response.json()data = data['response']['accounts']['hits']data = json_normalize(data)但是在我规范化我的数据框之后看起来像这样所以最终我想将响应与字段名称一起存储在数据框中。
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

过去我不得不做这种事情几次(将嵌套的 json 弄平)我将解释我的过程,你可以看看它是否有效,或者至少可以稍微处理一下代码以适应您的需求。


1)接受data响应,并使用函数将其完全扁平化。当我第一次不得不这样做时,这个博客非常有帮助。


2) 然后它遍历创建的平面字典,通过嵌套部分内的新键名称的编号来查找需要创建每一行和列的位置。还有一些键是唯一/不同的,所以它们没有一个数字来标识为“新”行,所以我在我称之为special_cols.


3)当它遍历这些时,拉出指定的行号(嵌入在那些平面键中),然后以这种方式构造数据帧。


这听起来很复杂,但是如果您逐行调试和运行,您就可以看到它是如何工作的。尽管如此,我相信它应该可以满足您的需求。


data = {'took': 476,

 '_revision': 'r08badf3',

 'response': {'accounts': {'hits': [{'name': '4002238760',

     'display_name': 'Googleglass-4002238760',

     'selected_fields': ['Googleglass',

      'DDMonkey',

      'Papu New Guinea',

      'Jonathan Vardharajan',

      '4002238760',

      'DDMadarchod-INSTE',

      None,

      'Googleglass',

      '0001012556',

      'CC',

      'Setu Non Standard',

      '40022387',

      320142,

      4651321321333,

      1324650651651]},

    {'name': '4003893720',

     'display_name': 'Swift-4003893720',

     'selected_fields': ['Swift',

      'DDMonkey',

      'Papu New Guinea',

      'Jonathan Vardharajan',

      '4003893720',

      'DDMadarchod-UPTM-RemotexNBD',

      None,

      'S.W.I.F.T. SCRL',

      '0001000110',

      'SE',

      'Setu Non Standard',

      '40038937',

      189508,

      1464739200000,

      1559260800000]}]}}}



import pandas as pd

import re



def flatten_json(y):

    out = {}


    def flatten(x, name=''):

        if type(x) is dict:

            for a in x:

                flatten(x[a], name + a + '_')

        elif type(x) is list:

            i = 0

            for a in x:

                flatten(a, name + str(i) + '_')

                i += 1

        else:

            out[name[:-1]] = x


    flatten(y)

    return out


flat = flatten_json(data)                      



results = pd.DataFrame()

special_cols = []


columns_list = list(flat.keys())

for item in columns_list:

    try:

        row_idx = re.findall(r'\_(\d+)\_', item )[0]

    except:

        special_cols.append(item)

        continue

    column = re.findall(r'\_\d+\_(.*)', item )[0]

    column = column.replace('_', '')


    row_idx = int(row_idx)

    value = flat[item]


    results.loc[row_idx, column] = value


for item in special_cols:

    results[item] = flat[item]

输出:


print (results.to_string())

         name             displayname selectedfields0 selectedfields1  selectedfields2       selectedfields3 selectedfields4              selectedfields5  selectedfields6  selectedfields7 selectedfields8 selectedfields9   selectedfields10 selectedfields11  selectedfields12  selectedfields13  selectedfields14  took _revision

0  4002238760  Googleglass-4002238760     Googleglass        DDMonkey  Papu New Guinea  Jonathan Vardharajan      4002238760            DDMadarchod-INSTE              NaN      Googleglass      0001012556              CC  Setu Non Standard         40022387          320142.0      4.651321e+12      1.324651e+12   476  r08badf3

1  4003893720        Swift-4003893720           Swift        DDMonkey  Papu New Guinea  Jonathan Vardharajan      4003893720  DDMadarchod-UPTM-RemotexNBD              NaN  S.W.I.F.T. SCRL      0001000110              SE  Setu Non Standard         40038937          189508.0      1.464739e+12      1.559261e+12   476  r08badf3



查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信