我有一个嵌套的 JSON 结构,我需要将其展平。使用 JSON 标准化时,它会展平所有键。但是,我想展平特定的键,同时保留嵌套的其他键。如何使用 JSON 标准化来实现这一点。我正在尝试做的详细描述如下。
JSON 数据看起来像这样
data = {"Attachment":[{"url":"URL001", "type":"pdf"},
{"url":"URL002", "type":"pdf"}],
"Image":{"url":"URL001", "type":"png"},
"Lookup":{"ProductName":"Item001", "ProductId":"001"}}
运行以下代码片段时,它会展平
Image
和Lookup
字段。
from pandas.io.json import json_normalize
df = json_normalize(data)
df.to_json(orient="records")
输出看起来像,
Attachment Image.URL Image.Type Lookup.ProductName Lookup.ProductId
[{...}, {...}] URL001 png Item001 001
但我不想压平
Image
键并保持原样。
预期输出如下
Attachment Image Lookup.ProductName Lookup.ProductId
[{...}, {...}] {"url":...,} Item001 001
有没有办法使用 JSON 标准化来实现这一点。
您可以将
data
分成两个单独的字典吗?执行 2 个不同的转换操作,然后连接各自的数据帧:
data1 = {k:v for k,v in data.iteritems() if k!='Image'}
data2 = {k:v for k,v in data.iteritems() if k=='Image'}
df = pd.io.json.json_normalize(data1).join(pd.DataFrame([data2]))
据我所知,没有办法压平一个字段,但不能压平同一级别的其他字段。因此,您可以对同一个 json 进行两次规范化,但在
max_level
函数中使用 pd.json_normalize
指定哪个级别,然后在删除不需要的列后将它们连接在一起。
代码:
import pandas as pd
df_level0 = pd.json_normalize(data, max_level=0).drop(columns=['Lookup', 'Attachment'])
df_level1 = pd.json_normalize(data, max_level=1)
df_level1 = df_level1.loc[:,~df_level1.columns.str.startswith('Image')]
df = pd.concat([df_level0, df_level1], axis=1)
给你预期的输出