精品教程,用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)

输出的结果如下

4bfb2ec0c9cee3d02f37115463ce0bbc.png

下面我们来看一个稍微有点复杂的例子,在列表中带有多个json格式的数据

json_list = [
    {'学校': '清华大学', '地理位置': '北京', '排名': 1},
    {'学校': '北京大学', '地理位置': '北京', '排名': 2},
]
pd.json_normalize(json_list)

输出的结果为

c68db7eff0037c58680cfd189b097a78.png

02

解析带有多层数据的json数据

下面我们来看一个带有多层json格式数据的对象,在“联系方式”这一层中还有“邮件”“电话号码”,在“信息”这一层中有“学生”“联系方式”两层,层层相套

json_obj = {
    '学校': '清华大学',
    '地理位置': '北京',
    '排名': 1,
    '信息': {
        '学生': '张三',
        '联系方式': {
            '邮件': {
                'qq邮箱': 'zhangsan@qq.com',
                '163邮箱': 'zhangsan@.com'
            },
            '电话号码': '123456789',
        }
    }
}

我们尝试用json_normalize()方法来解析一下

pd.json_normalize(json_obj)

输出的结果如下

15e72630b158c989c672a7c94a93c308.png

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

6036fdbe7ea9dd787c101a1b275818b4.png

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

5291d2da54d6f2b34aa2edb8d83b1436.png

下面我们来解析一个列表中带有多个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)

输出的结果为

2f074987d8bfd7c5d983eae8847df8ac.png

读者朋友要是有空可以自己另外将max_level设置为2和3,看看输出的结果有什么不同

03

解析带有嵌套列表的json格式数据

我们先来解析一个带有多层嵌套列表的json格式的数据

json_obj = {
    '学校': '清华大学',
    '地理位置': '北京',
    '排名': 1,
    '信息': {
        '学生': '张三',
        '联系方式': {
            '邮件': {
                'qq邮箱': 'zhangsan@qq.com',
                '163邮箱': 'zhangsan@.com'
            },
            '电话号码': '123456789',
        }
    },
    '老师': [
        {"名字": "王五"}, 
        {"名字": "王六"},
        {"名字": "王七"}
    ]
    
}

代码如下

pd.json_normalize(json_obj)

输出的结果如下

004d2750ed2872c546921dd0e4d6624d.png

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

44014e33407a9bd55b82081816e1acf9.png

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

b1c2a8abfc8ee9a3a6c6f4b4d329a66f.png

04

为嵌套层级的json格式数据添加分隔符

对于存在嵌套层级的json格式的数据,在添加了分隔符之后将会更加容易阅读,例如类似下面的数据,我们加了分隔符之后

json_obj = {
    '学校': '清华大学',
    '地理位置': '北京',
    '排名': 1,
    '信息': {
        '学生': '张三',
        '联系方式': {
            '邮件': {
                'qq邮箱': 'zhangsan@qq.com',
                '163邮箱': 'zhangsan@.com'
            },
            '电话号码': '123456789',
        }
    }
}


df = pd.json_normalize(json_obj, sep = "-->")

901a34f09761c49bd95f76019796312d.png

总体上说结果更加容易阅读与理解,尤其是理解该列在json格式的数据集中处于哪个位置

05

为json格式的数据添加前缀

添加前缀能够更加直观的展示出来数据是数据哪个层级范围的,我们通过record_prefixmeta_prefix这两个参数分别来赋值,为输出结果添加相应的前缀

json_obj = {
    '学校': '清华大学',
    '地理位置': '北京',
    '排名': 1,
    '信息': {
        '学生': '张三',
        '联系方式': {
            '邮件': {
                'qq邮箱': 'zhangsan@qq.com',
                '163邮箱': 'zhangsan@.com'
            },
            '电话号码': '123456789',
        }
    },
    '老师': [
        {"名字": "王五"}, 
        {"名字": "王六"},
        {"名字": "王七"}
    ]
}
pd.json_normalize(json_obj, record_path='老师',
                  meta=['学校', '地理位置', '排名'],
                  record_prefix='老师-->',
                  meta_prefix = '第一层级-->')

输出的结果如下

2b9347395e0a3e7ca8e227ba7764646c.png

我们可以直观的看出“名字”这一列的上级目录是“老师”,而“学校”、“地理位置”等是处于第一层级,因为也没有上级目录

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)

哦,对了,之后的文章,文末添加了留言的功能,要是觉得该篇文章有哪里写的不好,有哪里值得改进的地方,小编也是鼓励读者朋友们可以积极的提出来(写的不好的也希望大家轻喷,毕竟小编也是一个菜鸟),大家一起交流、一起进步

历史文章

流量至上的时代背景 明星赚个盆满钵满,来看看网友们的态度

分享14条非常实用的Pandas函数方法,建议珍藏!!

可视化图表告诉你,这部让网友直呼过瘾的国产剧究竟火在哪里

世界500强最新一轮排名出炉,最赚钱的行业竟然是它!?

分享、收藏、点赞、在看安排一下?

06be45be618f7798a80b5974148c3bc5.gif

9436ebfe065a5e5adae2970941f6cfe6.gif

46ecb277ae235f658f455a9d34ee428f.gif

21d32cd21b05b5d3f663dcc6cda850d6.gif