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

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

將嵌套 json 讀取到數據框中

將嵌套 json 讀取到數據框中

ibeautiful 2023-10-06 18:35:45
我有一個json從 Firebase 導出的文件,如下所示。{  "reports" : {    "Google-Pixel 2 XL" : {      "-MIoCtD9YUF2G9Esfrfz" : {        "message" : "04 Oct 2020 23:25:17:047 onCreate MainActivity",        "timestamp" : 1601825117067      },      "-MIoCtFVOxu8wdEHtm6q" : {        "message" : "04 Oct 2020 23:25:17:214 onCreate Service",        "timestamp" : 1601825117216      },      "-MIoCyBtKMQqQzUHEXsW" : {        "message" : "04 Oct 2020 23:25:37:682 onStartCommand Service",        "timestamp" : 1601825137685      },      "-MIoFWll9r3qwzWNoGMn" : {        "message" : "04 Oct 2020 23:36:47:687: (1.3212517, 103.860314)",        "timestamp" : 1601825807693      }    },    "Vivo 1820" : {      "-MIoF14JUm6JMZrOzDlL" : {        "message" : "04 Oct 2020 23:34:37:623 onCreate MainActivity",        "timestamp" : 1601825677653      },      "-MIoF1A9ZZNqTu5W-rQD" : {        "message" : "04 Oct 2020 23:34:38:016 onCreate Service",        "timestamp" : 1601825678026      },      "-MIoF2gNDua9FfLBTg6q" : {        "message" : "04 Oct 2020 23:34:44:235 onCreate MainActivity",        "timestamp" : 1601825684248      }    }  }}我正在嘗試將其轉換為 4 列數據框,如下所示model             | id                   | message                               | timestampGoogle-Pixel 2 XL | -MIoCtD9YUF2G9Esfrfz | 04 Oct 2020 23:25:17:047 onCreate...  | 1601825117067Vivo 1820         | -MIoF14JUm6JMZrOzDlL | 04 Oct 2020 23:34:37:623 onCreate...  | 1601825677653我怎么做?我嘗試了各種方法和標準化,但似乎無法得到它。data = pd.read_json("firebase-file.json")df = pd.json_normalize(data, record_path="reports")謝謝。
查看完整描述

3 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

我認為你需要自己壓平它,好在它并不復雜:


s = [[k, i, *j.values()] for k,v in data["reports"].items() for i, j in v.items()]


print (pd.DataFrame(s))


                   0                     1                                                  2              3

0  Google-Pixel 2 XL  -MIoCtD9YUF2G9Esfrfz     04 Oct 2020 23:25:17:047 onCreate MainActivity  1601825117067

1  Google-Pixel 2 XL  -MIoCtFVOxu8wdEHtm6q          04 Oct 2020 23:25:17:214 onCreate Service  1601825117216

2  Google-Pixel 2 XL  -MIoCyBtKMQqQzUHEXsW    04 Oct 2020 23:25:37:682 onStartCommand Service  1601825137685

3  Google-Pixel 2 XL  -MIoFWll9r3qwzWNoGMn  04 Oct 2020 23:36:47:687: (1.3212517, 103.860314)  1601825807693

4          Vivo 1820  -MIoF14JUm6JMZrOzDlL     04 Oct 2020 23:34:37:623 onCreate MainActivity  1601825677653

5          Vivo 1820  -MIoF1A9ZZNqTu5W-rQD          04 Oct 2020 23:34:38:016 onCreate Service  1601825678026

6          Vivo 1820  -MIoF2gNDua9FfLBTg6q     04 Oct 2020 23:34:44:235 onCreate MainActivity  1601825684248

分享


查看完整回答
反對 回復 2023-10-06
?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

根據 的官方文檔pd.json_normalize()它假設一個數組(列表)輸入。然而,原始的 json 遠非字典列表之類的東西,最重要的是,鍵“id”不存在。因此我認為絕對需要一個手工制作的解析器。

代碼

import pandas as pd

import json


file_path = "/mnt/ramdisk/in.json"


with open(file_path) as f:

    dic = json.load(f)


# discard the redundant "report" layer

dic = dic["reports"]


# produce a flattened list of dict

ls = []

for k1, v1 in dic.items():

    # k1 = model

    for k2, v2 in v1.items():

        # k2 = the hash-like id

        v2["model"] = k1

        v2["id"] = k2

        ls.append(v2)


df = pd.json_normalize(ls)

輸出


# Trim the message for printing purpose

df2 = df.copy()

df2["message"] = df["message"].apply(lambda s: s[:10])

df2


Out[28]: 

      message      timestamp              model                    id

0  04 Oct 202  1601825117067  Google-Pixel 2 XL  -MIoCtD9YUF2G9Esfrfz

1  04 Oct 202  1601825117216  Google-Pixel 2 XL  -MIoCtFVOxu8wdEHtm6q

2  04 Oct 202  1601825137685  Google-Pixel 2 XL  -MIoCyBtKMQqQzUHEXsW

3  04 Oct 202  1601825807693  Google-Pixel 2 XL  -MIoFWll9r3qwzWNoGMn

4  04 Oct 202  1601825677653          Vivo 1820  -MIoF14JUm6JMZrOzDlL

5  04 Oct 202  1601825678026          Vivo 1820  -MIoF1A9ZZNqTu5W-rQD

6  04 Oct 202  1601825684248          Vivo 1820  -MIoF2gNDua9FfLBTg6q

注意:深入到類哈希id所在的層似乎是有必要的。這是因為最初id是keys,但似乎必須重新格式化它們才能values正確解釋為值pd.json_normalize。我在互聯網上的簡單調查也沒有找到使用簡單的內置方法來解析這種遞歸結構的示例。


查看完整回答
反對 回復 2023-10-06
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

嘗試一下這個(參見我上面的評論)


import pandas as pd



data = []

for k, v in test['reports'].items():

    model_name = k

    for model in v.items():

        _data = {}

        _data['model'] = model_name

        _data['id'] = model[0]

        _data['message'] = model[1]['message']

        _data['timestamp'] = model[1]['timestamp']

        data.append(_data)

df = pd.DataFrame(data)

test你的數據在哪里,從而test['reports']訪問你想要解析的嵌套信息


查看完整回答
反對 回復 2023-10-06
  • 3 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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