Свести вложенный словарь в список ключ: значение - PullRequest
1 голос
/ 03 апреля 2019

Я запрашиваю API компании для антикоррупционного расследования и получаю результаты во вложенном JSON, который можно увидеть здесь .Я хотел бы преобразовать этот словарь в простой формат {key:value, key:value}, где, если у меня есть вложенные объекты или списки, ключи объединяются в уплощенную строку ключей.

Проблема также в том, что некоторые элементы, возвращаемые API, могутне обязательно иметь все пары ключ: значение, поскольку некоторые из них являются необязательными. Если пара ключ: значение отсутствует, то я бы хотел вставить NA.

Вот JSON в полном объеме - хотя некоторые результаты запроса могут содержать не все эти записи.

{
   "items" : [
      {
         "address" : {
            "address_line_1" : "string",
            "address_line_2" : "string",
            "care_of" : "string",
            "country" : "string",
            "locality" : "string",
            "po_box" : "string",
            "postal_code" : "string",
            "premises" : "string",
            "region" : "string"
         },
         "address_snippet" : "string",
         "appointment_count" : "integer",
         "date_of_birth" : {
            "month" : "integer",
            "year" : "integer"
         },
         "description" : "string",
         "description_identifiers" : [
            "integer"
         ],
         "kind" : "string",
         "links" : {
            "self" : "string"
         },
         "matches" : [
            {
               "address_snippet" : [
                  "integer"
               ],
               "snippet" : [
                  "integer"
               ],
               "title" : [
                  "integer"
               ]
            }
         ],
         "snippet" : "string",
         "title" : "string"
      }
   ],
   "items_per_page" : "integer",
   "kind" : "string",
   "start_index" : "integer",
   "total_results" : "integer"
}

Повторное использование старого кода JQ Мне удалось создать два списка, один из которых содержит все ключи, а другой - все значения (см. Jqplay здесь ).

Вот пример для небольшого словаря, чтобы понять идею:

{
   "items_address_address_line_1" : "string",
   "items_address_address_line_2" : "string"
   "items_address_care_of" : "string",
   "items_address_country" : "string",
   "items_address_locality" : "string",
   "items_address_po_box" : "string",
   "items_address_postal_code" : "string",
   "items_address_premises" : "string",
   "items_address_region" : "string"
   }

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вы можете использовать панд , в частности json_normalize

from pandas.io.json import json_normalize

d = {
    "items" : [
        {
            "address" : {
                "address_line_1" : "string",
                "address_line_2" : "string",
                "care_of" : "string",
                "country" : "string",
                "locality" : "string",
                "po_box" : "string",
                "postal_code" : "string",
                "premises" : "string",
                "region" : "string"
            },
            "address_snippet" : "string",
            "appointment_count" : "integer",
            "date_of_birth" : {
                "month" : "integer",
                "year" : "integer"
            },
            "description" : "string",
            "description_identifiers" : [
                "integer"
            ],
            "kind" : "string",
            "links" : {
                "self" : "string"
            },
            "matches" : [
                {
                    "address_snippet" : [
                        "integer"
                    ],
                    "snippet" : [
                        "integer"
                    ],
                    "title" : [
                        "integer"
                    ]
                }
            ],
            "snippet" : "string",
            "title" : "string"
        }
    ],
    "items_per_page" : "integer",
    "kind" : "string",
    "start_index" : "integer",
    "total_results" : "integer"
}


x = json_normalize(d['items'], sep="_")
print(x.to_string())
# print(x.keys()) # handy, as you may get "lost" with many keys
# x.to_dict(

 address_address_line_1 address_address_line_2 address_care_of address_country address_locality address_po_box address_postal_code address_premises address_region address_snippet appointment_count date_of_birth_month date_of_birth_year description description_identifiers    kind links_self                                            matches snippet   title
0                 string                 string          string          string           string         string              string           string         string          string           integer             integer            integer      string               [integer]  string     string  [{'address_snippet': ['integer'], 'snippet': [...  string  string

Примечания:

  1. Вы можете повторно использовать json_normalize, чтобы сгладить дополнительные вложенные элементы (списки) по мере необходимости.
  2. Обычно я сначала расплавляю все объекты в новые кадры данных, а затем объединяю все в новый master_df со всеми keysсплющенные.Надеюсь, это имеет смысл для вас, в противном случае, пожалуйста, прокомментируйте.
0 голосов
/ 03 апреля 2019

при условии, что массив items всегда имеет один элемент, используйте параметр --stream;

reduce (inputs|select(length == 2)) as $p
({}; .[$p[0]|map(strings)|join("_")] = $p[1])

, поскольку используется inputs, также требуется параметр -n.

...