Как перечислить элементы JSON, не входящие в список, вместе с элементами списка с помощью pandas.json_normalize с помощью Python?
[{
"builtin_name": "custom_template",
"fields": [{
"id": 10012,
"field_type": "OBJECT_SET",
"tooltip_text": "",
"name_plural": "",
"name_singular": "reference",
"backref_name": "reference",
"backref_tooltip_text": "",
"allow_multiple": False,
"allowed_otypes": [
"schema",
"table",
"attribute",
"user",
"groupprofile",
"groupprofile"
],
"options": None,
"builtin_name": None
}, {
"id": 8,
"field_type": "OBJECT_SET",
"tooltip_text": None,
"name_plural": "Stewards",
"name_singular": "Steward",
"backref_name": "Steward",
"backref_tooltip_text": None,
"allow_multiple": True,
"allowed_otypes": [
"user",
"groupprofile",
"groupprofile"
],
"options": None,
"builtin_name": "steward"
}
],
"id": 16,
"title": "Custom template"
}]
Используя этот объект JSON, я хочу нормализовать его с помощью pandas.json_normalize.
Когда я это сделаю:
pd.json_normalize(data, "fields", errors='ignore', record_prefix='')
Я получаю
fields
перечислены в красивой табличной форме следующим образом:
id field_type tooltip_text name_plural name_singular backref_name backref_tooltip_text allow_multiple allowed_otypes options builtin_name
(за которыми следуют строки данных)
Но я также был Внешними свойствами,
id
,
title
а также
builtin_name
перечислено вместе с полями
Итак, я закончил так:
id builtin_name title id field_type tooltip_text name_plural name_singular backref_name backref_tooltip_text allow_multiple allowed_otypes options builtin_name
Я пробовал это:
pd.json_normalize(data, ["id", "builtin_name", "title"], "fields", errors='ignore', record_prefix='')
Но выдает ошибку, говоря, что id не является списком.
Также без квадратных скобок безрезультатно.
Как мне получить эти поля
"id", "builtin_name", "title"
перечислить вместе с другими в каждой строке?
Спасибо!
1 ответ
Я бы использовал
.json_normalize
в целом
data
список и
.explode()
в
fields
столбец. Затем выполните concat, чтобы получить желаемый DataFrame:
df = pd.json_normalize(data, errors="ignore", record_prefix="")
df = pd.concat(
[df, df.explode("fields")["fields"].apply(pd.Series)], axis=1
).drop(columns="fields")
print(df)
Печать:
builtin_name id title id field_type tooltip_text name_plural name_singular backref_name backref_tooltip_text allow_multiple allowed_otypes options builtin_name
0 custom_template 16 Custom template 10012 OBJECT_SET reference reference False [schema, table, attribute, user, groupprofile,... None None
0 custom_template 16 Custom template 8 OBJECT_SET None Stewards Steward Steward None True [user, groupprofile, groupprofile] None steward