Pandas JSON normalize создает запутанное сообщение "KeyError"?
Я пытаюсь преобразовать вложенный JSON в фрейм данных Pandas. Я использовал json_normalize
С успехом, пока я не наткнулся на определенный JSON. Я сделал уменьшенную версию, чтобы воссоздать проблему.
from pandas.io.json import json_normalize
json=[{"events": [{"schedule": {"date": "2015-08-27",
"location": {"building": "BDC", "floor": 5},
"ID": 815},
"group": "A"},
{"schedule": {"date": "2015-08-27",
"location": {"building": "BDC", "floor": 5},
"ID": 816},
"group": "A"}]}]
Я тогда бегу:
json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
ожидал увидеть что-то вроде этого:
ID group schedule.date schedule.location.building schedule.location.floor
'815' 'A' '2015-08-27' 'BDC' 5
'816' 'A' '2015-08-27' 'BDC' 5
но вместо этого я получаю эту ошибку:
In [2]: json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-b588a9e3ef1d> in <module>()
----> 1 json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in json_normalize(data, record_path, meta, meta_prefix, record_prefix)
739 records.extend(recs)
740
--> 741 _recursive_extract(data, record_path, {}, level=0)
742
743 result = DataFrame(records)
/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in _recursive_extract(data, path, seen_meta, level)
734 meta_val = seen_meta[key]
735 else:
--> 736 meta_val = _pull_field(obj, val[level:])
737 meta_vals[key].append(meta_val)
738
/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in _pull_field(js, spec)
674 if isinstance(spec, list):
675 for field in spec:
--> 676 result = result[field]
677 else:
678 result = result[spec]
KeyError: 'schedule'
2 ответов
в этом случае, я думаю, вы просто используете это:
In [57]: json_normalize(data[0]['events'])
Out[57]:
group schedule.ID schedule.date schedule.location.building \
0 A 815 2015-08-27 BDC
1 A 816 2015-08-27 BDC
schedule.location.floor
0 5
1 5
на meta
дорожки ([['schedule','date']...]
) предназначены для указания данных на том же уровне вложенности, что и ваши записи, т. е. на том же уровне, что и "события". Это не похоже на json_normalize
обрабатывает дикты с вложенными списками особенно хорошо, поэтому вам может потребоваться выполнить ручную перестройку, если ваши фактические данные намного сложнее.
Я получил KeyError, когда структура json не была последовательной. Смысл, когда один из вложенных strucutes пропали из JSON, я KeyError.
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.json.json_normalize.html
из примеров, упомянутых на сайте документации pandas, если вы сделаете вложенный тег (графства) отсутствующим в одной из записей, вы получите KeyError. Чтобы обойти это, вы могли бы чтобы убедиться, что игнорировать отсутствующий тег или рассмотреть только записи, которые имеют вложенный столбец/тег, заполненный данными.