Pandas JSON_仅对特定列进行标准化

问题描述 投票:0回答:2

我有一个嵌套的 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 标准化来实现这一点。

python pandas scikit-learn pandas-groupby sklearn-pandas
2个回答
0
投票

您可以将

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]))

0
投票

据我所知,没有办法压平一个字段,但不能压平同一级别的其他字段。因此,您可以对同一个 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)

给你预期的输出

© www.soinside.com 2019 - 2024. All rights reserved.