Преобразовать вложенный ответ JSON в dataframe в пандах Python - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий ответ JSON.

[{'a': 
     [{'b': 1,
       'c': 'ok',
       'result': 
               [{'1': '2',
                 '3': 4,
                 '5': 6}]},
      {'b': 11,
       'c': 'ok1',
       'result': 
               [{'1': '21',
                 '3': 41,
                 '5': 61},
                {'1': '211',
                 '3': '411'}]}],     

  'Id': 'd0',
  'col': 16}]

Я хочу нормализовать это для фрейма данных в пандах Python.Я знаю о json_normalize и видел несколько других сообщений SO на том же.Тем не менее, мой, кажется, более глубоко вложен, чем другие, и я не могу обойти это.

То, что я ожидаю в своем выводе, выглядит следующим образом:

===============================================================
a.b | a.c | a.result.1 | a.result.3 | a.result.5 |  Id  | col 
===============================================================
1   | ok  |    2       |      4     |      6     |  d0  |  16
11  | ok1 |    21      |      41    |      61    |  d0  |  16
11  | ok1 |    211     |      411   |      None  |  d0  |  16

Любая помощь будет принята с благодарностью!Застрял в этом более чем на день!

Спасибо !!

1 Ответ

0 голосов
/ 16 мая 2018

По моему опыту, у панд нет хорошего способа справиться с lists в dicts в lists слишком хорошо. Но вы можете обработать только lists в dicts, используя аргумент record_path в json_normalize. Таким образом, это не очень, и довольно хрупкий способ решения проблемы ... но вот решение :

data = # That mess
frames = []

for entry in data:
    frame = json_normalize(
        data[0]['a'], 
        record_path=('result'), 
        record_prefix='a.result.', 
        meta=['b', 'c'], 
        meta_prefix='a.'
    )

    frame['Id'] = entry['Id']
    frame['col'] = entry['col']
    frames.append(frame)

frame = pd.concat(frames)

Выход:

  a.result.1 a.result.3  a.result.5  a.b  a.c  Id  col
0          2          4         6.0    1   ok  d0   16
1         21         41        61.0   11  ok1  d0   16
2        211        411         NaN   11  ok1  d0   16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...