Pandas JSON_仅规范化特定列

v64noz0r  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个嵌套的JSON结构,我需要扁平化。在使用JSON normalize时,它会将所有的键都扁平化。但是,我想扁平化特定的键,同时保留嵌套的其他键。如何使用JSON normalize实现这一点。我试图做的详细描述如下。
JSON数据看起来像这样

  1. data = {"Attachment":[{"url":"URL001", "type":"pdf"},
  2. {"url":"URL002", "type":"pdf"}],
  3. "Image":{"url":"URL001", "type":"png"},
  4. "Lookup":{"ProductName":"Item001", "ProductId":"001"}}

字符串
在运行以下代码段时,它同时删除ImageLookup字段。

  1. from pandas.io.json import json_normalize
  2. df = json_normalize(data)
  3. df.to_json(orient="records")


输出结果类似于,

  1. Attachment Image.URL Image.Type Lookup.ProductName Lookup.ProductId
  2. [{...}, {...}] URL001 png Item001 001


但我不想展平Image键并保持原样。
预期输出如下所示

  1. Attachment Image Lookup.ProductName Lookup.ProductId
  2. [{...}, {...}] {"url":...,} Item001 001


有没有一种方法可以使用JSON规范化来实现这一点。

iswrvxsc

iswrvxsc1#

据我所知,没有办法使一个字段变平,但不能使同一级别的其他字段变平。因此,你可以将同一个json规格化两次,但在pd.json_normalize函数中使用max_level指定在哪个级别,然后在删除不需要的列后将它们连接在一起。
代码:

  1. import pandas as pd
  2. data = {"Attachment":[{"url":"URL001", "type":"pdf"},
  3. {"url":"URL002", "type":"pdf"}],
  4. "Image":{"url":"URL001", "type":"png"},
  5. "Lookup":{"ProductName":"Item001", "ProductId":"001"}}
  6. df_level0 = pd.json_normalize(data, max_level=0).drop(columns=['Lookup', 'Attachment'])
  7. df_level1 = pd.json_normalize(data, max_level=1)
  8. df_level1 = df_level1.loc[:,~df_level1.columns.str.startswith('Image')]
  9. df = pd.concat([df_level0, df_level1], axis=1)

字符串
给出了预期的输出

展开查看全部
gopyfrb3

gopyfrb32#

你可以把data分成两个不同的字典。执行两个不同的transform操作,然后连接各自的子帧:

  1. data1 = {k:v for k,v in data.iteritems() if k!='Image'}
  2. data2 = {k:v for k,v in data.iteritems() if k=='Image'}
  3. df = pd.io.json.json_normalize(data1).join(pd.DataFrame([data2]))

字符串

相关问题