#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 разве это не решает вашу проблему?