Как перечислить элементы 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
Другие вопросы по тегам