软件测试|数据处理神器pandas教程(五)

简介: 软件测试|数据处理神器pandas教程(五)

在这里插入图片描述

前言

上一篇文章我们介绍了pandas读写CSV文件的有关方法,本篇文章我们介绍pandas读取JSON文件的方法。pandas同样可以很方便地处理JSON文件。

关于json

JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML,但是JSON 比 XML 更小、更快,更易解析。

数据准备

我们根据部分省份2022年的经济社会发展数据创建了一个名为data.json文件,文件内容如下:

[
  {
    "省份": "广东",
    "人口": 12684,
    "地区": "中南",
    "GDP": 129118.58
  },
  {
    "省份": "江苏",
    "人口": 8505.4,
    "地区": "华东",
    "GDP": 122875.6
  },
  {
    "省份": "山东",
    "人口": 10169.99,
    "地区": "华东",
    "GDP": 87435
  },
  {
    "省份": "浙江",
    "人口": 6540,
    "地区": "华东",
    "GDP": 77715
  },
  {
    "省份": "河南",
    "人口": 9883,
    "地区": "中南",
    "GDP": 61345.05
  },
  {
    "省份": "四川",
    "人口": 8372,
    "地区": "西南",
    "GDP": 56749.8
  },
  {
    "省份": "湖北",
    "人口": 5844,
    "地区": "中南",
    "GDP": 53734.92
  },
  {
    "省份": "福建",
    "人口": 4188,
    "地区": "华东",
    "GDP": 53109.85
  },
  {
    "省份": "湖南",
    "人口": 6604,
    "地区": "中南",
    "GDP": 48670.37
  },
  {
    "省份": "安徽",
    "人口": 6127,
    "地区": "华东",
    "GDP": 45045
  },
  {
    "省份": "上海",
    "人口": 2489.43,
    "地区": "华东",
    "GDP": 44652.8
  },
  {
    "省份": "河北",
    "人口": 7420,
    "地区": "华北",
    "GDP": 42370.4
  },
  {
    "省份": "北京",
    "人口": 2188.6,
    "地区": "华北",
    "GDP": 41610.9
  },
  {
    "省份": "陕西",
    "人口": 3954,
    "地区": "西北",
    "GDP": 32772.68
  },
  {
    "省份": "江西",
    "人口": 4517.4,
    "地区": "华东",
    "GDP": 32074.7
  }
]

pandas读取json文件

与读取csv文件类似,pandas提供了read_json()方法读取json文件内容,示例如下:

import pandas as pd

df = pd.read_json('data.json')
print(df.to_string())

----------------------------
输出结果如下:
    省份        人口  地区        GDP
0   广东  12684.00  中南  129118.58
1   江苏   8505.40  华东  122875.60
2   山东  10169.99  华东   87435.00
3   浙江   6540.00  华东   77715.00
4   河南   9883.00  中南   61345.05
5   四川   8372.00  西南   56749.80
6   湖北   5844.00  中南   53734.92
7   福建   4188.00  华东   53109.85
8   湖南   6604.00  中南   48670.37
9   安徽   6127.00  华东   45045.00
10  上海   2489.43  华东   44652.80
11  河北   7420.00  华北   42370.40
12  北京   2188.60  华北   41610.90
13  陕西   3954.00  西北   32772.68
14  江西   4517.40  华东   32074.70

和读取csv文件相似,我们加上to_string()即可返回DataFrame。

除了处理json文件,同样也可以读取json字符串,示例如下:

import pandas as pd

data = [
  {
    "省份": "广东",
    "人口": 12684,
    "地区": "中南",
    "GDP": 129118.58
  },
  {
    "省份": "江苏",
    "人口": 8505.4,
    "地区": "华东",
    "GDP": 122875.6
  },
  {
    "省份": "山东",
    "人口": 10169.99,
    "地区": "华东",
    "GDP": 87435
  },
  {
    "省份": "浙江",
    "人口": 6540,
    "地区": "华东",
    "GDP": 77715
  },
  {
    "省份": "河南",
    "人口": 9883,
    "地区": "中南",
    "GDP": 61345.05
  },
  {
    "省份": "四川",
    "人口": 8372,
    "地区": "西南",
    "GDP": 56749.8
  },
  {
    "省份": "湖北",
    "人口": 5844,
    "地区": "中南",
    "GDP": 53734.92
  },
  {
    "省份": "福建",
    "人口": 4188,
    "地区": "华东",
    "GDP": 53109.85
  },
  {
    "省份": "湖南",
    "人口": 6604,
    "地区": "中南",
    "GDP": 48670.37
  },
  {
    "省份": "安徽",
    "人口": 6127,
    "地区": "华东",
    "GDP": 45045
  },
  {
    "省份": "上海",
    "人口": 2489.43,
    "地区": "华东",
    "GDP": 44652.8
  },
  {
    "省份": "河北",
    "人口": 7420,
    "地区": "华北",
    "GDP": 42370.4
  },
  {
    "省份": "北京",
    "人口": 2188.6,
    "地区": "华北",
    "GDP": 41610.9
  },
  {
    "省份": "陕西",
    "人口": 3954,
    "地区": "西北",
    "GDP": 32772.68
  },
  {
    "省份": "江西",
    "人口": 4517.4,
    "地区": "华东",
    "GDP": 32074.7
  }
]
df = pd.DataFrame(data)

print(df)

--------------------------
输出结果如下:
    省份        人口  地区        GDP
0   广东  12684.00  中南  129118.58
1   江苏   8505.40  华东  122875.60
2   山东  10169.99  华东   87435.00
3   浙江   6540.00  华东   77715.00
4   河南   9883.00  中南   61345.05
5   四川   8372.00  西南   56749.80
6   湖北   5844.00  中南   53734.92
7   福建   4188.00  华东   53109.85
8   湖南   6604.00  中南   48670.37
9   安徽   6127.00  华东   45045.00
10  上海   2489.43  华东   44652.80
11  河北   7420.00  华北   42370.40
12  北京   2188.60  华北   41610.90
13  陕西   3954.00  西北   32772.68
14  江西   4517.40  华东   32074.70

注:我们也可以从url中读取json

pandas读取内嵌json数据

很多时候,我们获取到的json数据并不是直接被我们读取成我们想要的DataFrame,示例如下:

import pandas as pd

data ={
  "conuntry": "中国",
  "year": 2022,
  "provice":[{
    "省份": "广东",
    "人口": 12684,
    "地区": "中南",
    "GDP": 129118.58
  },
  {
    "省份": "江苏",
    "人口": 8505.4,
    "地区": "华东",
    "GDP": 122875.6
  },
  {
    "省份": "山东",
    "人口": 10169.99,
    "地区": "华东",
    "GDP": 87435
  },
  {
    "省份": "浙江",
    "人口": 6540,
    "地区": "华东",
    "GDP": 77715
  },
  {
    "省份": "河南",
    "人口": 9883,
    "地区": "中南",
    "GDP": 61345.05
  },
  {
    "省份": "四川",
    "人口": 8372,
    "地区": "西南",
    "GDP": 56749.8
  },
  {
    "省份": "湖北",
    "人口": 5844,
    "地区": "中南",
    "GDP": 53734.92
  },
  {
    "省份": "福建",
    "人口": 4188,
    "地区": "华东",
    "GDP": 53109.85
  },
  {
    "省份": "湖南",
    "人口": 6604,
    "地区": "中南",
    "GDP": 48670.37
  },
  {
    "省份": "安徽",
    "人口": 6127,
    "地区": "华东",
    "GDP": 45045
  },
  {
    "省份": "上海",
    "人口": 2489.43,
    "地区": "华东",
    "GDP": 44652.8
  },
  {
    "省份": "河北",
    "人口": 7420,
    "地区": "华北",
    "GDP": 42370.4
  },
  {
    "省份": "北京",
    "人口": 2188.6,
    "地区": "华北",
    "GDP": 41610.9
  },
  {
    "省份": "陕西",
    "人口": 3954,
    "地区": "西北",
    "GDP": 32772.68
  },
  {
    "省份": "江西",
    "人口": 4517.4,
    "地区": "华东",
    "GDP": 32074.7
  }
]}
df = pd.DataFrame(data)

print(df)

输出结果如下图:

在这里插入图片描述
输出的DataFrame很显然不符合我们的要求,我们想要读到的是每一个省份的数据,那我们应该怎么办呢,pandas提供了一个json_normalize() 帮助我们将内嵌的数据完整的解析出来,以下是我们的代码示例:

import pandas as pd

data ={
  "conuntry": "中国",
  "year": 2022,
  "provice":[{
    "省份": "广东",
    "人口": 12684,
    "地区": "中南",
    "GDP": 129118.58
  },
  {
    "省份": "江苏",
    "人口": 8505.4,
    "地区": "华东",
    "GDP": 122875.6
  },
  {
    "省份": "山东",
    "人口": 10169.99,
    "地区": "华东",
    "GDP": 87435
  },
  {
    "省份": "浙江",
    "人口": 6540,
    "地区": "华东",
    "GDP": 77715
  },
  {
    "省份": "河南",
    "人口": 9883,
    "地区": "中南",
    "GDP": 61345.05
  },
  {
    "省份": "四川",
    "人口": 8372,
    "地区": "西南",
    "GDP": 56749.8
  },
  {
    "省份": "湖北",
    "人口": 5844,
    "地区": "中南",
    "GDP": 53734.92
  },
  {
    "省份": "福建",
    "人口": 4188,
    "地区": "华东",
    "GDP": 53109.85
  },
  {
    "省份": "湖南",
    "人口": 6604,
    "地区": "中南",
    "GDP": 48670.37
  },
  {
    "省份": "安徽",
    "人口": 6127,
    "地区": "华东",
    "GDP": 45045
  },
  {
    "省份": "上海",
    "人口": 2489.43,
    "地区": "华东",
    "GDP": 44652.8
  },
  {
    "省份": "河北",
    "人口": 7420,
    "地区": "华北",
    "GDP": 42370.4
  },
  {
    "省份": "北京",
    "人口": 2188.6,
    "地区": "华北",
    "GDP": 41610.9
  },
  {
    "省份": "陕西",
    "人口": 3954,
    "地区": "西北",
    "GDP": 32772.68
  },
  {
    "省份": "江西",
    "人口": 4517.4,
    "地区": "华东",
    "GDP": 32074.7
  }
]}

df = pd.json_normalize(data, record_path=['provice'])
print(df)
------------------------------
输出结果如下:
    省份        人口  地区        GDP
0   广东  12684.00  中南  129118.58
1   江苏   8505.40  华东  122875.60
2   山东  10169.99  华东   87435.00
3   浙江   6540.00  华东   77715.00
4   河南   9883.00  中南   61345.05
5   四川   8372.00  西南   56749.80
6   湖北   5844.00  中南   53734.92
7   福建   4188.00  华东   53109.85
8   湖南   6604.00  中南   48670.37
9   安徽   6127.00  华东   45045.00
10  上海   2489.43  华东   44652.80
11  河北   7420.00  华北   42370.40
12  北京   2188.60  华北   41610.90
13  陕西   3954.00  西北   32772.68
14  江西   4517.40  华东   32074.70

当然,数据可能会更加复杂一些,我们仍然可以读到我们想要的数据,示例数据如下:

{
    "club_name": "拜仁慕尼黑",
    "season": "2022-2023",
    "info": {
      "coach": "纳格尔斯曼",
      "主场": "慕尼黑安联球场",
      "赞助商": {
        "球衣": "阿迪达斯",
        "胸前广告": "德国电信"
      }
    },
    "player": [
    {
        "number": 25,
        "name": "Muller",
        "位置": "前腰",
        "进球": 20,
        "助攻": 21
    },
    {
        "number": 10,
        "name": "萨内",
        "位置": "前锋",
        "进球": 21,
        "助攻": 10
    },
    {
        "number": 6,
        "name": "基米希",
        "位置": "中场",
        "进球": 6,
        "助攻": 12
    }]
}

代码如下:

import pandas as pd
import json

with open('data2.json', encoding='utf-8') as f:
    data = json.loads(f.read())


df = pd.json_normalize(
    data,
    record_path=['player'],
    meta = [
        'season',
        ['info', 'coach'],
        ['info', '主场']
    ]
)

print(df)
------------------------------------
输出结果如下:
   number name  位置  进球  助攻     season info.coach  info.主场
0      25   穆勒  前腰  20  21  2022-2023      纳格尔斯曼  慕尼黑安联球场
1      10   萨内  前锋  21  10  2022-2023      纳格尔斯曼  慕尼黑安联球场
2       6  基米希  中场   6  12  2022-2023      纳格尔斯曼  慕尼黑安联球场

总结

本文主要介绍了pandas读取json数据的方法,除了直接读取json数据外,还可以读取嵌套的json数据,后续我们将介绍pandas处理Excel数据的方法。

相关文章
|
1天前
|
数据挖掘 数据处理 索引
Pandas高级数据处理:多级索引
Pandas的多级索引(MultiIndex)允许在一个轴上拥有多个层次的索引,适用于分层数据处理。可通过列表或已有DataFrame创建多级索引,如按日期和股票代码索引金融数据。常见问题包括索引层级混乱、数据选择困难和聚合操作复杂,解决方法分别为检查参数顺序、使用`loc`和`xs`方法选择数据、用`groupby()`进行聚合。代码案例展示了创建、调整索引层级、选择特定数据及聚合操作。
105 83
|
2月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
106 0
|
3月前
|
自然语言处理 机器人 Python
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
ChatPaper是一个基于文本生成技术的智能研究论文工具,能够根据用户输入进行智能回复和互动。它支持快速下载、阅读论文,并通过分析论文的关键信息帮助用户判断是否需要深入了解。用户可以通过命令行或网页界面操作,进行论文搜索、下载、总结等。
89 1
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
|
2月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
81 1
|
2月前
|
SQL 数据采集 数据挖掘
Pandas 教程
10月更文挑战第25天
67 2
|
2月前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
69 2
|
3月前
|
并行计算 大数据 数据处理
亿级数据处理,Pandas的高效策略
在大数据时代,数据量的爆炸性增长对处理技术提出更高要求。本文介绍如何利用Python的Pandas库及其配套工具高效处理亿级数据集,包括:采用Dask进行并行计算,分块读取以减少内存占用,利用数据库进行复杂查询,使用内存映射优化Pandas性能,以及借助PySpark实现分布式数据处理。通过这些方法,亿级数据处理变得简单高效,助力我们更好地挖掘数据价值。
205 1
|
3月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【10月更文挑战第1天】告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
105 4
|
3月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
107 3
|
8天前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。

热门文章

最新文章