Преобразование вложенного объекта JSON в фрейм данных pandas

#json #pandas #dataframe #nested-json

Вопрос:

Я имею дело с файлом JSON, который содержит вложенные поля (массивы). Я пытаюсь преобразовать то же самое в фрейм данных Pandas.

 {  "_id": "2026",  "dataDate": 1537920000000,  "dataYear": 2018,  "groupId": "1378",  "HourConsumed": 19781.4,  "HourGenerated": 0,  "max": 4658.400000000001,  "maxGen": 0,  "maxTime": 1538001000000,  "avg": -206.05625,  "max": 0,  "maxGen": 0,  "maxTime": null,  "avgTemp": 0,  "me_Id": "2004506_3166155129",  "interval": 15,  "intervalMetaData": [  "whC",  "whG",  "max",  "maxGen",  "hC",  "hG",  "maxVar",  "maxGen",  "avgTemp",  "eventTime"  ],  "intervalData": [  [  175.2,  0,  700.8,  0,  0,  0,  0,  0,  0,  1537920900000  ],  [  192,  0,  768,  0,  0,  0,  0,  0,  0,  1537921800000  ],  [  191.39999999999998,  0,  765.5999999999999,  0,  0,  0,  0,  0,  0,  1537922700000  ]  ] }  

Мне нужно создать отдельные столбцы того , что внутри intervalMetaData , а затем заполнить эти столбцы значениями из intervalData . Возможно ли это?

Ответ №1:

Если я правильно понимаю, вам просто нужно правильно настроить столбцы, импортировав свой список списков с пандами:

 import pandas as pd  data = {  "_id": "2026",  "dataDate": 1537920000000,  "dataYear": 2018,  "groupId": "1378",  "HourConsumed": 19781.4,  "HourGenerated": 0,  "max": 4658.400000000001,  "maxGen": 0,  "maxTime": 1538001000000,  "avg": -206.05625,  "max": 0,  "maxGen": 0,  "maxTime": None,  "avgTemp": 0,  "me_Id": "2004506_3166155129",  "interval": 15,  "intervalMetaData": [  "whC",  "whG",  "max",  "maxGen",  "hC",  "hG",  "maxVar",  "maxGen",  "avgTemp",  "eventTime"  ],  "intervalData": [  [  175.2,  0,  700.8,  0,  0,  0,  0,  0,  0,  1537920900000  ],  [  192,  0,  768,  0,  0,  0,  0,  0,  0,  1537921800000  ],  [  191.39999999999998,  0,  765.5999999999999,  0,  0,  0,  0,  0,  0,  1537922700000  ]  ] }   df = pd.DataFrame(data["intervalData"], columns=data["intervalMetaData"]) print(df)  

Выход:

 whC whG max maxGen hC hG maxVar maxGen avgTemp eventTime 0 175.2 0 700.8 0 0 0 0 0 0 1537920900000 1 192.0 0 768.0 0 0 0 0 0 0 1537921800000 2 191.4 0 765.6 0 0 0 0 0 0 1537922700000  

Изменить: вы можете добавить другие ключи в виде столбцов с циклом:

 for k,v in data.items():  if k not in ["intervalData", "intervalMetaData"]:  df[k] = v  

Комментарии:

1. Это здорово. Можно ли было бы получить и другие поля в том же фрейме данных? Это может повториться, я понимаю, но это не проблема

2. конечно! Я добавил цикл к своему ответу

Ответ №2:

Держу пари, это возможно! Все так просто, как это:

 df = pd.DataFrame(j['intervalData'], columns=j['intervalMetaData'])  

Комментарии:

1. @shivanshu разве это не решает вашу проблему?