Как преобразовать json в фрейм данных с помощью json_normalize?

Я пытаюсь скрыть ответ API от json до кадра данных в pandas. проблема, с которой я сталкиваюсь, заключается в том, что данные de вложены в формат json, и я не получаю правильные столбцы в своем фрейме данных.

Данные собираются из API в следующем формате:

{
    "data": [
        {
            "timestamp": "2019-04-10T11:40:13.437Z",
            "score": 87,
            "sensors": [
                {
                    "comp": "temp",
                    "value": 20.010000228881836
                },
                {
                    "comp": "humid",
                    "value": 34.4900016784668
                },
                {
                    "comp": "co2",
                    "value": 418
                },
                {
                    "comp": "voc",
                    "value": 166
                },
                {
                    "comp": "pm25",
                    "value": 4
                },
                {
                    "comp": "lux",
                    "value": 961.4000244140625
                },
                {
                    "comp": "spl_a",
                    "value": 45.70000076293945
                }
            ],
            "indices": [
                {
                    "comp": "temp",
                    "value": -1
                },
                {
                    "comp": "humid",
                    "value": -2
                },
                {
                    "comp": "co2",
                    "value": 0
                },
                {
                    "comp": "voc",
                    "value": 0
                },
                {
                    "comp": "pm25",
                    "value": 0
                }
            ]
        },
        {
            "timestamp": "2019-04-10T11:40:03.413Z",
            "score": 87,
            "sensors": [
                {
                    "comp": "temp",
                    "value": 20.040000915527344
                },
                {
                    "comp": "humid",
                    "value": 34.630001068115234
                },
                {
                    "comp": "co2",
                    "value": 418
                },
                {
                    "comp": "voc",
                    "value": 169
                },
                {
                    "comp": "pm25",
                    "value": 5
                },
                {
                    "comp": "lux",
                    "value": 960.2000122070312
                },
                {
                    "comp": "spl_a",
                    "value": 46
                }
            ],
            "indices": [
                {
                    "comp": "temp",
                    "value": -1
                },
                {
                    "comp": "humid",
                    "value": -1
                },
                {
                    "comp": "co2",
                    "value": 0
                },
                {
                    "comp": "voc",
                    "value": 0
                },
                {
                    "comp": "pm25",
                    "value": 0
                }
            ]
        },

редактировать, как вы можете видеть, это больше наборов данных

Я уже пробовал следующее: я преобразовал формат JSON в dict, а затем нормализовал его с помощью функции normalize. см. следующий код:

data = r.json() 

works_data = json_normalize(data=data['data'], record_path=['sensors'],meta=['timestamp'])

df = pd.DataFrame.from_dict(works_data)
print(df)

результат, который я получаю:

 comp        value                 timestamp
0      temp    21.059999  2019-04-10T12:39:05.062Z
1     humid    31.250000  2019-04-10T12:39:05.062Z
2       co2   407.000000  2019-04-10T12:39:05.062Z
3       voc   136.000000  2019-04-10T12:39:05.062Z
4      pm25     3.000000  2019-04-10T12:39:05.062Z
5       lux  1302.099976  2019-04-10T12:39:05.062Z
6     spl_a    46.299999  2019-04-10T12:39:05.062Z

результат, который мне нужен, выглядит следующим образом: результат

есть ли кто-нибудь, кто может мне помочь?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
675
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете изменить форму своих work_data:

data = {
    "data": [
        {
            "timestamp": "2019-04-10T11:40:13.437Z",
            "score": 87,
            "sensors": [
                {
                    "comp": "temp",
                    "value": 20.010000228881836
                },
                {
                    "comp": "humid",
                    "value": 34.4900016784668
                },
                {
                    "comp": "co2",
                    "value": 418
                },
                {
                    "comp": "voc",
                    "value": 166
                },
                {
                    "comp": "pm25",
                    "value": 4
                },
                {
                    "comp": "lux",
                    "value": 961.4000244140625
                },
                {
                    "comp": "spl_a",
                    "value": 45.70000076293945
                }
            ],
            "indices": [
                {
                    "comp": "temp",
                    "value": -1
                },
                {
                    "comp": "humid",
                    "value": -2
                },
                {
                    "comp": "co2",
                    "value": 0
                },
                {
                    "comp": "voc",
                    "value": 0
                },
                {
                    "comp": "pm25",
                    "value": 0
                }
            ]
        },
        {
            "timestamp": "2019-04-10T11:40:03.413Z",
            "score": 87,
            "sensors": [
                {
                    "comp": "temp",
                    "value": 20.040000915527344
                },
                {
                    "comp": "humid",
                    "value": 34.630001068115234
                },
                {
                    "comp": "co2",
                    "value": 418
                },
                {
                    "comp": "voc",
                    "value": 169
                },
                {
                    "comp": "pm25",
                    "value": 5
                },
                {
                    "comp": "lux",
                    "value": 960.2000122070312
                },
                {
                    "comp": "spl_a",
                    "value": 46
                }
            ],
            "indices": [
                {
                    "comp": "temp",
                    "value": -1
                },
                {
                    "comp": "humid",
                    "value": -1
                },
                {
                    "comp": "co2",
                    "value": 0
                },
                {
                    "comp": "voc",
                    "value": 0
                },
                {
                    "comp": "pm25",
                    "value": 0
                }
            ]
        }]}


from pandas.io.json import json_normalize
import pandas as pd        

df = pd.DataFrame()
for each in data['data']:
    timestamp = each['timestamp']
    temp_df = json_normalize(data=each, record_path=['sensors']).T

    columns = list(temp_df.iloc[0])
    data_values = list(temp_df.iloc[1,:])

    temp_df = pd.DataFrame([data_values + [timestamp]], columns=columns + ['timestamp'])

    df = df.append(temp_df).reset_index(drop=True)



print(df)

Выход:

print(df)
        temp      humid    co2  ...         lux      spl_a                 timestamp
0  20.010000  34.490002  418.0  ...  961.400024  45.700001  2019-04-10T11:40:13.437Z
1  20.040001  34.630001  418.0  ...  960.200012  46.000000  2019-04-10T11:40:03.413Z

[2 rows x 8 columns]

это именно то, что мне нужно, единственное, что у меня есть более 1 из этих наборов json, поэтому код теперь делает то, что он делает из всех столбцов наборов, поэтому у меня много столбцов. но я хочу, чтобы он создавал только 1 набор столбцов, а затем просто добавлял больше строк, чтобы увидеть отредактированные данные json для лучшего образца.

Rahul Sharma 10.04.2019 17:28

так что новая строка для каждой метки времени?

chitown88 10.04.2019 17:35

дружище ты классный! это именно то, что мне было нужно

Rahul Sharma 10.04.2019 20:52

Другие вопросы по теме