Ошибка ключа при распаковке вложенной записи

#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"] это список)