Прочитать список вложенных jsons в панде dataframe - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть файл json, который я прочитал со следующим кодом.

import json
from pprint import pprint

with open('file.json') as json_data:
    d = json.load(json_data)
    json_data.close()
    pprint(d)

Это дает следующий список (не dict):

[{'heading': 120.078125,
  'latitude': 60.84809244149443,
  'longitude': 12.706842578952859,
  'warning': None},
 {'heading': 178.2421875,
  'latitude': 60.847404287244046,
  'longitude': 12.70678398944969,
  'warning': {'disabled': True,
              'latitude': 60.8464254391783,
              'longitude': 12.70724018571071,
              'signal': [{'latitude': 52.388542281214,
                         'longitude': 4.6362899175721},
                        {'latitude': 52.388602884476,
                         'longitude': 4.6350475833697}]

             }}]

Проблема, которую я нахожу, связана с«предупреждение» о вложенном Json Когда я использую следующий код для выравнивания JSON

from pandas.io.json import json_normalize    
df = json_normalize(d)

, я получаю фрейм данных с JSON в сигнале столбца.Когда я использую следующий код (вместо предыдущего) для выравнивания JSON

df = json_normalize(d,"warning")

, я получаю следующую ошибку

string indices must be integers

Может ли кто-нибудь помочь мне получить кадр данных без JSON?Заранее спасибо!

1 Ответ

0 голосов
/ 29 ноября 2018

Ваш новый json в основном представляет собой список словарей, где некоторые словари могут содержать другой словарь, содержащий список словарей.Поскольку нет структуры для этого, json_normalize не является подходящим способом (обратите внимание, что json_normalize для полуструктурированных json в соответствии с документами и, например, не допускает однозапись существует в одном диктовке, а не в другом).

Для этого вам придется вручную изменить форму json, прежде чем читать ее в pandas.Одна идея могла бы состоять в том, чтобы сплющить всю вещь:

def flatten_json(y):
    #  As seen here: https://towardsdatascience.com/flattening-json-objects-in-python-f5343c794b10
    out = {}

    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x

    flatten(y)
    return out

df = json_normalize([flatten_json(row) for row in d])
print(df)

      heading   latitude  longitude warning_disabled  warning_latitude  \
0  120.078125  60.848092  12.706843              NaN               NaN   
1  178.242188  60.847404  12.706784             True         60.846425   

   warning_longitude  warning_signal_0_latitude  warning_signal_0_longitude  \
0                NaN                        NaN                         NaN   
1           12.70724                  52.388542                     4.63629   

   warning_signal_1_latitude  warning_signal_1_longitude  
0                        NaN                         NaN  
1                  52.388603                    4.635048  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...