如何将嵌套JSON数据转换为Pandas DataFrame

对于复杂的JSON数据进行分析时,通常的做法是将JSON数据结构转换为Pandas DataFrame,因为它可以帮助更方便地操作和可视化数据。在本文中,让我们考虑不同的嵌套JSON数据结构,并使用内置和自定义函数将它们扁平化。

Pandas有一个很好的内置函数json_normalize(),可以将简单到中等半结构化的嵌套JSON结构扁平化为数据表。

语法: pandas.json_normalize(data, errors=’raise’, sep=’.’, max_level=None)

参数:
data - 字典或字典列表
errors - {‘raise’, ‘ignore’},,默认值”raise“
sep - str,默认值“.”嵌套记录将生成由指定分隔符分隔的名称。
max_level - int,默认为None。要规格化的最大级别数(字典深度)。

JSON - > Pandas DataFrame示例

大多数通过从Web提取的数据都是JSON数据类型的形式,因为JSON是在Web应用程序中传输数据的首选数据类型。首选JSON的原因是,由于文件大小很小,它非常轻量级,可以在HTTP请求和响应中来回发送。

下面是我们可以在Python中扁平化嵌套json的示例:

示例1:Pandas json_normalize函数

考虑一个嵌套字典列表,其中包含有关学生及其分数的详细信息。在这个JSON数据结构上使用pandas json_normalize,将其扁平化为一个扁平表,如图所示

import pandas as pd

data = [
	{"Roll no": 1,
	"student": {"first_name": "Ram", "last_name": "kumar"}
	},
	{"student": {"English": "95", "Math": "88"}
	},
	{"Roll no": 2,
	"student": {"first_name": "Joseph", "English": "90", "Science": "82"}
	},
	{"Roll no": 3,
	"student": {"first_name": "abinaya", "last_name": "devi"},
	"student": {"English": "91", "Math": "98"}
	},
]

df = pd.json_normalize(data)
print(df)

输出

   Roll no student.first_name student.last_name student.English student.Math student.Science
0        1                Ram            kumar            NaN          NaN             NaN
1      NaN                NaN              NaN             95           88             NaN
2        2             Joseph              NaN             90          NaN              82
3        3            abinaya             devi             91           98             NaN

示例2:使用max_level=0在Pandas中展平嵌套的JSON

现在让我们使用max_level选项将一个稍微复杂的JSON结构扁平化为一个扁平表。在这个例子中,我们考虑了max_level为0,这意味着只扁平化JSON的第一层,并且可以对结果进行实验。

在这里,我们考虑了一个JSON格式的不同个人健康记录的示例。

import pandas as pd

data = [
	{
		"id": 1,
		"candidate": "Roberto mathews",
		"health_index": {"bmi": 22, "blood_pressure": 130},
	},
	{"candidate": "Shane wade", "health_index": {"bmi": 28, "blood_pressure": 160}},
	{
		"id": 2,
		"candidate": "Bruce tommy",
		"health_index": {"bmi": 31, "blood_pressure": 190},
	},
]
pd.json_normalize(data, max_level=0)

输出

由于我们只使用了一个层次的扁平化,第二个层次被保留为键值对

	id	candidate	health_index
0	1.0	Roberto mathews	{'bmi': 22, 'blood_pressure': 130}
1	NaN	Shane wade	{'bmi': 28, 'blood_pressure': 160}
2	2.0	Bruce tommy	{'bmi': 31, 'blood_pressure': 190}

示例3:使用max_level=1在Pandas中展平嵌套的JSON

现在让我们使用与上面相同的JSON数据结构,max_level为1,这意味着将JSON的前两个级别扁平化,并可以对结果进行实验。


import pandas as pd
 
data = [
    {
        "id": 1,
        "candidate": "Roberto mathews",
        "health_index": {"bmi": 22, "blood_pressure": 130},
    },
    {"candidate": "Shane wade", "health_index": {"bmi": 28, "blood_pressure": 160}},
    {
        "id": 2,
        "candidate": "Bruce tommy",
        "health_index": {"bmi": 31, "blood_pressure": 190},
    },
]
pd.json_normalize(data, max_level=1)

输出

	id	candidate	health_index.bmi	health_index.blood_pressure
0	1.0	Roberto mathews	22	130
1	NaN	Shane wade	28	160
2	2.0	Bruce tommy	31	190

示例4:将Meta参数传递给json_normalize

最后,让我们考虑一个深度嵌套的JSON结构,通过将Meta参数传递给json_normalize函数,可以将其转换为数据表,如下所示。

这里,在下面的代码中,我们已经将JSON必须解析到数据表的时间顺序传递给了它。在下面的代码中,我们首先建议解析部门键,然后是公司和标语,然后,我们将management和CEO键作为嵌套列表传递,表明它们必须作为单个字段解析。

import pandas as pd
data = [
	{
		"company": "Google",
		"tagline": "Dont be evil",
		"management": {"CEO": "Sundar Pichai"},
		"department": [
			{"name": "Gmail", "revenue (bn)": 123},
			{"name": "GCP", "revenue (bn)": 400},
			{"name": "Google drive", "revenue (bn)": 600},
		],
	},
	{
		"company": "Microsoft",
		"tagline": "Be What's Next",
		"management": {"CEO": "Satya Nadella"},
		"department": [
			{"name": "Onedrive", "revenue (bn)": 13},
			{"name": "Azure", "revenue (bn)": 300},
			{"name": "Microsoft 365", "revenue (bn)": 300},
		],
	},

]
result = pd.json_normalize(
	data, "department", ["company", "tagline", ["management", "CEO"]]
)
result

输出

          name  revenue (bn)   company         tagline management.CEO
0        Gmail           123    Google    Dont be evil  Sundar Pichai
1          GCP           400    Google    Dont be evil  Sundar Pichai
2  Google drive           600    Google    Dont be evil  Sundar Pichai
3     Onedrive            13  Microsoft  Be What's Next  Satya Nadella
4        Azure           300  Microsoft  Be What's Next  Satya Nadella
5  Microsoft 365           300  Microsoft  Be What's Next  Satya Nadella
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值