精品教程,用Pandas解析json格式的数据,建议收藏
在实际工作中,尤其是网页端数据的传输,我们经常会遇到json数据,看上去和Python当中的字典类型的数据很像,本文呢小编就通过pandas当中的内置方法json_normalize()来处理json格式的数据,最终生成DataFrame数据集方便我们进行后续的操作。本文主要想通过json_normalize()这个方法解析复杂格式的json形式的数据
在开始之前,我们先导入相应的依赖库,
import pandas as pd
01
解析基本的json格式的数据
我们先来看一个简单的例子
a_dict = {
'学校': '北京大学',
'地理位置': '北京',
'排名': 2
}
代码如下
pd.json_normalize(a_dict)
输出的结果如下

下面我们来看一个稍微有点复杂的例子,在列表中带有多个json格式的数据
json_list = [
{'学校': '清华大学', '地理位置': '北京', '排名': 1},
{'学校': '北京大学', '地理位置': '北京', '排名': 2},
]
pd.json_normalize(json_list)
输出的结果为

02
解析带有多层数据的json数据
下面我们来看一个带有多层json格式数据的对象,在“联系方式”这一层中还有“邮件”和“电话号码”,在“信息”这一层中有“学生”和“联系方式”两层,层层相套
json_obj = {
'学校': '清华大学',
'地理位置': '北京',
'排名': 1,
'信息': {
'学生': '张三',
'联系方式': {
'邮件': {
'qq邮箱': 'zhangsan@qq.com',
'163邮箱': 'zhangsan@.com'
},
'电话号码': '123456789',
}
}
}
我们尝试用json_normalize()方法来解析一下
pd.json_normalize(json_obj)
输出的结果如下

上面的数据是有3层的嵌套,也可以通过用pd.json_normalize(json_obj, max_level=3)来解析3层嵌套的数据,这边就要提到函数中max_level参数,max_level参数代表着解析json对象的最大层级数,适用于有多层嵌套的json对象。要是我们将max_level设置为1,则输出的结果,邮件中的联系方式是没有被拆开来的

要是我们将max_level设置为2,则输出的结果,联系方式中的邮件内容是没有被拆开来的

下面我们来解析一个列表中带有多个json格式,并且一个json格式的数据下还带有多层嵌套的数据,
json_list = [
{
'姓名': '张三',
'学号': 1,
'年龄': 18,
'联系方式': {
'邮箱': {
'QQ邮箱': 'zhangsan@qq.com',
'163邮箱': 'zhangsan@163.com'
}
}
},
{
'姓名': '李四',
'学号': 2,
'年龄': 20,
'联系方式': {
'邮箱': {
'QQ邮箱': 'lisi@qq.com',
'163邮箱': 'lisi@163.com'
}
}
}
]
pd.json_normalize(json_list)
输出的结果为

读者朋友要是有空可以自己另外将max_level设置为2和3,看看输出的结果有什么不同
03
解析带有嵌套列表的json格式数据
我们先来解析一个带有多层嵌套列表的json格式的数据
json_obj = {
'学校': '清华大学',
'地理位置': '北京',
'排名': 1,
'信息': {
'学生': '张三',
'联系方式': {
'邮件': {
'qq邮箱': 'zhangsan@qq.com',
'163邮箱': 'zhangsan@.com'
},
'电话号码': '123456789',
}
},
'老师': [
{"名字": "王五"},
{"名字": "王六"},
{"名字": "王七"}
]
}
代码如下
pd.json_normalize(json_obj)
输出的结果如下

可以从输出的结果中看到,“老师”这一列中的值并没有被拆开来,是用一个[]括起来的列表,这里我们就可以使用参数“record_path”,其功能是将json对象中的嵌套列表单独展示出来,

我们还可以通过“meta”为该结果添加其他的内容,

04
为嵌套层级的json格式数据添加分隔符
对于存在嵌套层级的json格式的数据,在添加了分隔符之后将会更加容易阅读,例如类似下面的数据,我们加了分隔符之后
json_obj = {
'学校': '清华大学',
'地理位置': '北京',
'排名': 1,
'信息': {
'学生': '张三',
'联系方式': {
'邮件': {
'qq邮箱': 'zhangsan@qq.com',
'163邮箱': 'zhangsan@.com'
},
'电话号码': '123456789',
}
}
}
df = pd.json_normalize(json_obj, sep = "-->")

总体上说结果更加容易阅读与理解,尤其是理解该列在json格式的数据集中处于哪个位置
05
为json格式的数据添加前缀
添加前缀能够更加直观的展示出来数据是数据哪个层级范围的,我们通过record_prefix和meta_prefix这两个参数分别来赋值,为输出结果添加相应的前缀
json_obj = {
'学校': '清华大学',
'地理位置': '北京',
'排名': 1,
'信息': {
'学生': '张三',
'联系方式': {
'邮件': {
'qq邮箱': 'zhangsan@qq.com',
'163邮箱': 'zhangsan@.com'
},
'电话号码': '123456789',
}
},
'老师': [
{"名字": "王五"},
{"名字": "王六"},
{"名字": "王七"}
]
}
pd.json_normalize(json_obj, record_path='老师',
meta=['学校', '地理位置', '排名'],
record_prefix='老师-->',
meta_prefix = '第一层级-->')
输出的结果如下

我们可以直观的看出“名字”这一列的上级目录是“老师”,而“学校”、“地理位置”等是处于第一层级,因为也没有上级目录
06
to_json()函数保存成json文件
to_json()方法顾名思义就是将DataFrame数据集保存成json格式的文件,加上force_ascii=False的选项之后,保存好的文件内容会以中文的格式显示出来
df.to_json("学生信息.json", force_ascii=False)
07
读取本地的json文件
在将数据存到本地之后,我们要是想读取本地以".json"结尾的文件,我们可以先通过json模块将数据导入,然后再用json_normalize()方法整理成DataFrame的格式
import json
with open("example.json", "r") as f:
data = json.loads(f.read())
pd.json_normalize(data)
哦,对了,之后的文章,文末添加了留言的功能,要是觉得该篇文章有哪里写的不好,有哪里值得改进的地方,小编也是鼓励读者朋友们可以积极的提出来(写的不好的也希望大家轻喷,毕竟小编也是一个菜鸟),大家一起交流、一起进步
历史文章
分享、收藏、点赞、在看安排一下?



