Как нормализовать вложенный 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'}]}