Преобразуйте этот вложенный JSON в pandas dataframe. - PullRequest
0 голосов
/ 12 октября 2019

Вот мой json:

my_json = {
    "machine_name": {
        "0100": [
            {
                "date": "21/03/2019",
                "chainage": "27760.156",
                "unix_time": "1553110535",
                "time": "03:35:35",
                "f0001": "0.0",
                "f0002": "0.0",
                "f0006": "0.0",
                "f0007": "0.0",
                "f0008": "0.0",
                "f0009": "0.0"
            },
            {
                "date": "22/03/2019",
                "chainage": "27760.156",
                "unix_time": "1553110535",
                "time": "03:35:35",
                "f0001": "0.0",
                "f0002": "0.0",
                "f0006": "0.0",
                "f0007": "0.0",
                "f0008": "0.0",
                "f0009": "0.0"
            }
        ],
        "0101": [
            {
                "date": "21/03/2019",
                "chainage": "27761.498",
                "unix_time": "1553131029",
                "time": "09:17:09",
                "f0001": "0.347",
                "f0002": "0.007",
                "f0006": "2.524",
                "f0007": "0.0",
                "f0008": "121.036",
                "f0009": "0.0"
            },
            {
                "date": "22/03/2019",
                "chainage": "27761.498",
                "unix_time": "1553131029",
                "time": "09:17:09",
                "f0001": "0.347",
                "f0002": "0.007",
                "f0006": "2.524",
                "f0007": "0.0",
                "f0008": "121.036",
                "f0009": "0.0"
            }
        ]
    }
}

Я хочу создать фрейм данных pandas с заголовками «date», «chainage», «unix_time» и т. Д., Объединяя «массив объектов»для «0100» и «0101» в один фрейм данных.

Я посмотрел на read_json и json_normalize, но результаты не соответствуют ожидаемым. Есть идеи, как добиться желаемого результата?

Ответы [ 2 ]

1 голос
/ 12 октября 2019
>>> rows = [v[0] for k, v in my_json['machine_name'].items()]
>>> rows # I fixed up the line-wrapping here for readability.
[{'date': '21/03/2019', 'chainage': '27760.156', 'unix_time': '1553110535', 
'time': '03:35:35', 'f0001': '0.0', 'f0002': '0.0', 'f0006': '0.0', 
'f0007': '0.0', 'f0008': '0.0', 'f0009': '0.0'}, {'date': '21/03/2019',
'chainage': '27761.498', 'unix_time': '1553131029', 'time': '09:17:09',
'f0001': '0.347', 'f0002': '0.007', 'f0006': '2.524', 'f0007': '0.0',
'f0008': '121.036', 'f0009': '0.0'}]

Это дало нам список фактических диктов, заключенных в одноэлементные списки, которые являются значениями dict в machine_name, из которых мы затем можем составить таблицу:

>>> df = pd.DataFrame(rows)

и добавьте индекс:

# we need to convert to Index explicitly from the dict_keys.
>>> index = pd.Index(my_json['machine_name'].keys())
>>> df.set_index(index, inplace=True)

Результат мне подходит:

>>> df
       chainage        date  f0001  f0002  ...    f0008 f0009      time   unix_time
0100  27760.156  21/03/2019    0.0    0.0  ...      0.0   0.0  03:35:35  1553110535
0101  27761.498  21/03/2019  0.347  0.007  ...  121.036   0.0  09:17:09  1553131029

[2 rows x 10 columns]
0 голосов
/ 12 октября 2019

следующее, кажется, работает.

Одна заметка, учитывая то, как вы объявляете переменную my_json, Python будет читать ее как словарь, а не как строку json.

import pandas as pd


my_json = { ... } # you data --it will be read as a dictionary by default.

# for convenience, create this variable
d = my_json['machine_name']


# create a list to store each row (i.e.: 0100, 0101)
dict_ls = []

# loop through d and store each internal dictionary (i.e: d[0100], d[0101]...etc) in the list
for row in d.keys():
  dict_ls.append(d[row][0])

# convert the list of dictionaries into a dataframe
df = pd.DataFrame(dict_ls) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...