#python #pandas #dictionary #nested
#python #панды #словарь #вложенный
Вопрос:
У меня есть этот код ниже, который предназначен для распаковки вложенной записи при ее обнаружении. Иногда это работает, а иногда выдает ошибку.
У кого-нибудь есть идея, как это решить?
Данные (работает):
d = {
"_id" : 245,
"connId" : "3r34b32",
"roomList" : [
{
"reportId" : 29,
"siteId" : 1
}]
}
Данные (не работает):
d = {
"_id" : 2,
"connId" : 128,
"Config" : {
"Id" : 5203,
"TemplateId" : "587",
"alertRules" : [
{
"id" : 6,
"daysOfTheWeek" : [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
}
]
}}
Код (динамический):
root = pd.json_normalize(d)
nested_cols = [i for i in root.columns if isinstance(root[i][0], list)]
l = [root.drop(nested_cols,1),]
for i in nested_cols:
l.append(pd.json_normalize(d, record_path=i))
output = pd.concat(l, axis=1)
print(output)
Ошибка обратной трассировки:
Traceback (most recent call last):
File "c:/Users/Max/Desktop/Azure/TestTimerTrigger/testing.py", line 30, in <module>
l.append(pd.json_normalize(d, record_path=i))
File "c:UsersMaxDesktopAzure.venvlibsite-packagespandasiojson_normalize.py", line 336, in _json_normalize
_recursive_extract(data, record_path, {}, level=0)
File "c:UsersMaxDesktopAzure.venvlibsite-packagespandasiojson_normalize.py", line 309, in _recursive_extract
recs = _pull_records(obj, path[0])
File "c:UsersMaxDesktopAzure.venvlibsite-packagespandasiojson_normalize.py", line 248, in _pull_records
result = _pull_field(js, spec)
File "c:UsersMaxDesktopAzure.venvlibsite-packagespandasiojson_normalize.py", line 239, in _pull_field
result = result[spec]
KeyError: 'Config.alertRules'
Ожидаемый результат:
_id,connid,config.id,config.templateid,id,daysoftheweek
2,128,5203,587,6,[mon,tue,wed,thu,fri,sat,sun]
Примечание:
Я знаю, что a keyerror
— это когда ключ в словаре не может быть найден, однако я не уверен, как решить эту проблему.
Любая помощь или рекомендации будут высоко оценены.
Ответ №1:
Он ищет ключ Config.alertRules
в вашем dict like d["Config.alertRules"]
. Это вложенный dict, поэтому вы должны его индексировать, например d["Config"]["alertRules"]
, как вы передаете эти ключи?
Эта ошибка, вероятно, не возникает для вашего первого словаря, поскольку там нет вложенных dicts. ( d["roomList"]
это список)