如何将 JSON 非列表项与 pandas.json_normalize 和 Python 的列表项一起列出?

How to list JSON non-list items together with list items with pandas.json_normalize with 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 以漂亮的 table 形式列出,如下所示:

id field_type tooltip_text name_plural name_singular backref_name backref_tooltip_text allow_multiple allowed_otypes options builtin_name

(后面是数据行)

但我也是外部属性,idtitlebuiltin_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" 与每行中的其他字段一起列出?

谢谢!

我会在整个 data 列表中使用 .json_normalize,在 fields 列中使用 .explode()。然后连接回去获得所需的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