1
[{
    "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,titlebuiltin_name与字段一起列出

所以我结束了这个:

id builtin_name 标题 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"与每行中的其他字段一起列出?

谢谢!

4

1 回答 1

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
于 2021-04-17T16:34:38.777 回答