Как нормализовать вложенный json с помощью json_normalize

Я пытаюсь создать фреймворк pandas из вложенного json. Почему-то мне кажется, что я не могу обратиться к третьему уровню.

Мой json выглядит примерно так:

        "numberOfResults": 376,
  "results": [
    {
      "name": "single",
      "docs": [
        {
          "id": "RAKDI342342",
          "type": "Culture",
          "category": "Culture",
          "media": "unknown",
          "label": "exampellabel",
          "title": "testtitle and titletest",
          "subtitle": "Archive" 

            ]
        },
        {
          "id": "GUI6N5QHBPTO6GJ66VP5OXB7GKX6J7ER",
          "type": "Culture",
          "category": "Culture",
          "media": "image",
          "label": "more label als example",
          "title": "test the second title",
          "subtitle": "picture"
          

и так далее.

В части «docs» находятся все фактические результаты, начиная с «id». Как только вся информация есть, просто следует следующий блок, начинающийся с «id».

Теперь я пытаюсь создать таблицу с ключами id,label и title (для начала) для каждого из этих отдельных блоков (в данном случае фактических элементов).

После определения search_url (откуда я беру json) мой код для этого в настоящее время выглядит следующим образом:

      result = requests.get(search_url)
data = result.json()
data.keys() 

При этом мне говорят, что dict_keys следующие:

      dict_keys(['numberOfResults', 'results', 'facets', 'entities', 'fulltexts', 'correctedQuery', 'highlightedTerms', 'randomSeed', 'nextCursorMark'])

Учитывая приведенный выше json, я знаю, что хочу изучить «результаты», а затем - «документы». Согласно найденной мною документации, я смогу добиться этого, напрямую адресовав часть результатов, а затем адресовав вложенный бит, разделив поля знаком «.». Теперь я попробовал следующий код:

      fields = ["docs.id", "docs.label", "docs.title"]
df = pd.json_normalize(data["results"])
df[fields]

Это работает до тех пор, пока не будет df[field] - на этом этапе программа сообщает мне:

      KeyError: "['docs.id'] not in index"

Это действительно работает для уровня выше, поэтому, если я попробую то же самое с «name» и «docs», я получу прекрасный фреймворк. Что я делаю неправильно? Я все еще новичок в Python и pandas и буду очень признателен за любую помощь!

РЕДАКТИРОВАТЬ:

Желаемый результат фрейма данных будет выглядеть примерно так:

          id              label            title  
0   RAKDI342342     exampellabel     testtitle and titletest    

1 ответ

  • Использовать pandas.json_normalize()
  • В следующем коде используется pandas v.1.2.4
  • Если вам не нужны другие столбцы, удалите список keys назначен meta
  • Использовать pandas.DataFrame.drop чтобы удалить любые другие нежелательные столбцы из df.
      import pandas as pd

df = pd.json_normalize(data, record_path=['results', 'docs'], meta=[['results', 'name'], 'numberOfResults'])

display(df)
                                 id     type category    media                   label                    title subtitle results.name numberOfResults
0                       RAKDI342342  Culture  Culture  unknown            exampellabel  testtitle and titletest  Archive       single             376
1  GUI6N5QHBPTO6GJ66VP5OXB7GKX6J7ER  Culture  Culture    image  more label als example    test the second title  picture       single             376

Данные

  • Опубликованный JSON / Dict сформирован неправильно
  • Принимая следующую исправленную форму
      data = \
{'numberOfResults': 376,
 'results': [{'docs': [{'category': 'Culture',
                        'id': 'RAKDI342342',
                        'label': 'exampellabel',
                        'media': 'unknown',
                        'subtitle': 'Archive',
                        'title': 'testtitle and titletest',
                        'type': 'Culture'},
                       {'category': 'Culture',
                        'id': 'GUI6N5QHBPTO6GJ66VP5OXB7GKX6J7ER',
                        'label': 'more label als example',
                        'media': 'image',
                        'subtitle': 'picture',
                        'title': 'test the second title',
                        'type': 'Culture'}],
              'name': 'single'}]}
Другие вопросы по тегам