преобразовать dict of dict в информационный кадр - PullRequest
1 голос
/ 10 мая 2019

У меня немного сложный JSON, который мне нужно преобразовать в информационный кадр. Это стандартный вывод json из другого API, и поэтому имена полей не изменятся.

У меня есть приведенный ниже диктат, более сложный, чем тот, с которым я работал до сих пор

>>> import pandas as pd
>>> data = [{'annotation_spec': {'description': 'Story_Driven',
...    'display_name': 'Story_Driven'},
...   'segments': [{'confidence': 0.52302074,
...     'segment': {'end_time_offset': {'nanos': 973306000, 'seconds': 14},
...      'start_time_offset': {}}}]},
...  {'annotation_spec': {'description': 'real', 'display_name': 'real'},
...   'segments': [{'confidence': 0.5244379,
...     'segment': {'end_time_offset': {'nanos': 973306000, 'seconds': 14},
...      'start_time_offset': {}}}]}]

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

from pandas.io.json import json_normalize
pd.DataFrame.from_dict(json_normalize(data,record_path= 
['segments'],meta=[['annotation_spec','description'], 
['annotation_spec','display_name']],errors='ignore'))

Это дает мне такой вывод

>>> from pandas.io.json import json_normalize
>>> pd.DataFrame.from_dict(json_normalize(data,record_path=['segments'],meta=[['annotation_spec','description'],['annotation_spec','display_name']],errors='ignore'))
   confidence                                            segment annotation_spec.description annotation_spec.display_name
0    0.523021  {u'end_time_offset': {u'nanos': 973306000, u's...                Story_Driven                 Story_Driven
1    0.524438  {u'end_time_offset': {u'nanos': 973306000, u's...                        real                         real
>>>

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

1 Ответ

1 голос
/ 10 мая 2019

В основном json_normalize заботится о вложенных диктах, здесь у нас проблема из-за списка в ключе сегментов.

Так что, если длина списка всегда будет 1, мы можем просто удалить список и затем применить json_normalize

### function to remove the lsit, we basically check if its a list, if so just take the first element
remove_list = lambda dct:{k:(v[0] if type(v)==list else v) for k,v in dct.items()}

data_clean = [remove_list(entry) for entry in data]

json_normalize(data_clean, sep="__")

enter image description here

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