Я пытаюсь скрыть ответ 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
результат, который мне нужен, выглядит следующим образом: результат
есть ли кто-нибудь, кто может мне помочь?
Вы можете изменить форму своих 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 для лучшего образца.