在python中规范化复杂的Json

Posted

技术标签:

【中文标题】在python中规范化复杂的Json【英文标题】:Normalizing Complex Json in python 【发布时间】:2020-01-20 16:15:15 【问题描述】:

我正在尝试使用 pandas 规范化 json 函数,但无法展平 json 中的嵌套数组

我已尝试阅读其中一个示例,但使用此代码只给了我一条记录

from pandas.io.json import json_normalize
data =
"id":"001",
    "counties" : [ "name":"y","name":"X"], 
"extendedDescriptionFrench" : "Fromage Brick Petit Gaspesien",
"brand" : "PETIT GASPESIEN",
"brandFrench" : "PETIT GASPESIEN",
"productLife" : "90",
"digitalAssetFoodservice" : [ 
"digitalAssetFormatFoodservice" : "JPG",
"digitalAssetGDTIFoodservice" : "754000000016500000000002167445",
"digitalAssetImageVersionDateTimeFoodservice" : "2016-06-28T20:06:06.000-04:00",
"digitalAssetStateFoodservice" : "P"
, 
"digitalAssetFormatFoodservice" : "JPG",
"digitalAssetGDTIFoodservice" : "754000000016500000000002167597",
"digitalAssetImageTypeFoodservice" : "M",
"digitalAssetImageVersionDateTimeFoodservice" : "2016-06-28T20:06:06.000-04:00"
, 
"digitalAssetFormatFoodservice" : "JPG",
"digitalAssetGDTIFoodservice" : "754000000016500000000002167687",
"digitalAssetImageTypeFoodservice" : "C",
"digitalAssetImageVersionDateTimeFoodservice" : "2016-06-28T20:06:06.000-04:00",
"digitalAssetStateFoodservice" : "C"
 ]


a=json_normalize(data)
    print(a)

有没有办法将“digitalAssetFoodservice”数组展平成列。

这是我得到的输出

如果我有多个嵌套数组字段怎么办

【问题讨论】:

你打算做什么,什么不起作用? a=json_normalize(data["digitalAssetFoodservice"]) 的输出呢? 我们能否规范化并输出这个字段+其他标量字段,因为我希望整个 json 被规范化 您能否添加多个嵌套数组字段的示例,因为如果它们不匹配相同的索引(我理解您的意思),将它们附加到表中是不合适的. @CeliusStingher 编辑了我的 JSON:包括“县”归档 但是,您的预期输出是什么?每次都重复,一次用于name: x,一次用于name: y 【参考方案1】:

我认为您需要将嵌套数组的键与非嵌套的键一起传递。

a=json_normalize(data,'digitalAssetFoodservice',['id','extendedDescriptionFrench','brand','productLife'])

print(a)
print(a.columns)

输出:

  digitalAssetFormatFoodservice     digitalAssetGDTIFoodservice digitalAssetImageVersionDateTimeFoodservice  ...      extendedDescriptionFrench            brand productLife
0                           JPG  754000000016500000000002167445               2016-06-28T20:06:06.000-04:00  ...  Fromage Brick Petit Gaspesien  PETIT GASPESIEN          90
1                           JPG  754000000016500000000002167597               2016-06-28T20:06:06.000-04:00  ...  Fromage Brick Petit Gaspesien  PETIT GASPESIEN          90
2                           JPG  754000000016500000000002167687               2016-06-28T20:06:06.000-04:00  ...  Fromage Brick Petit Gaspesien  PETIT GASPESIEN          90

[3 rows x 9 columns]
Index(['digitalAssetFormatFoodservice', 'digitalAssetGDTIFoodservice',
       'digitalAssetImageVersionDateTimeFoodservice',
       'digitalAssetStateFoodservice', 'digitalAssetImageTypeFoodservice',
       'id', 'extendedDescriptionFrench', 'brand', 'productLife'],
      dtype='object')

尝试两种情况时:

这是我想出的,因为我找不到在一行中生成预期输出的方法。我还稍微更改了脚本以使其更容易。 (基于:“问题:您的预期输出是什么?每个重复,名称一次:x,名称:y 一次?OP:是,重复”

from pandas.io.json import json_normalize
data =
"id":"001",
"counties" : [ "name":"y","name":"X"], 
"eDF" : "Fromage Brick Petit Gaspesien",
"brand" : "PETIT GASPESIEN",
"brandFrench" : "PETIT GASPESIEN",
"productLife" : "90",
"dAF" : [ 
"dAFF" : "JPG",
"dAGDTIF" : "75401652167445",
"dAIVDTF" : "2016-06-28",
"dASF" : "P"
, 
"dAFF" : "JPG",
"dAGDTIF" : "75401652167597",
"dAITFa" : "M",
"dAIVDTF" : "2016-06-28"
, 
"dAFF" : "JPG",
"dAGDTIF" : "7540162167687",
"dAITF" : "C",
"dAIVDTF" : "2016-06-28",
"dASF" : "C"
 ]


repetitive = ['id','eDF','brand','brandFrench','productLife']
a=json_normalize(data,'counties',repetitive)
b=json_normalize(data,'dAF',repetitive)
c = a.merge(b,how='inner',left_on=repetitive,right_on=repetitive)
print(a)

输出:

 name   id                            eDF            brand      brandFrench productLife
0    y  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90
1    X  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90

现在是另一个b

print(b)

输出:

  dAFF         dAGDTIF     dAIVDTF dASF dAITFa dAITF   id                            eDF            brand      brandFrench productLife
0  JPG  75401652167445  2016-06-28    P    NaN   NaN  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90
1  JPG  75401652167597  2016-06-28  NaN      M   NaN  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90
2  JPG   7540162167687  2016-06-28    C    NaN     C  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90

终于c

print(c)

输出:

  name   id                            eDF            brand      brandFrench productLife dAFF         dAGDTIF     dAIVDTF dASF dAITFa dAITF
0    y  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90  JPG  75401652167445  2016-06-28    P    NaN   NaN
1    y  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90  JPG  75401652167597  2016-06-28  NaN      M   NaN
2    y  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90  JPG   7540162167687  2016-06-28    C    NaN     C
3    X  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90  JPG  75401652167445  2016-06-28    P    NaN   NaN
4    X  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90  JPG  75401652167597  2016-06-28  NaN      M   NaN
5    X  001  Fromage Brick Petit Gaspesien  PETIT GASPESIEN  PETIT GASPESIEN          90  JPG   7540162167687  2016-06-28    C    NaN     C

【讨论】:

可以在json_normalize函数中传递其他嵌套数组字段吗? 是的,编辑你的问题,我会相应地编辑我的答案。 好的,所以对于每个嵌套字段,我们必须创建另一个变量,然后使用内部 Right 完全合并? 我只是找不到一种方法来处理它,我一直在尝试搜索一些示例,也无法让 lostCode 的答案起作用。你可以在这里试试,也许你能找到一些东西***.com/questions/47242845/…但是不一样,希望我的回答对你解决问题有足够的帮助。 是的,它很有用,谢谢:)

以上是关于在python中规范化复杂的Json的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中规范化包含列表(应保存为列表)的 json 文件熊猫?

python Json规范化处理

如何通过 Python Pandas 正确规范化 json

shell编程规范与变量

python操作:json文件中存在NumberInt(0),没有引号,无法解析?

如何将嵌套的 JSON 键规范化为 pandas 数据帧