亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將深度嵌套的 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 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號