学习python第15天

其实前面学的根本不记得了,小丑.jpg,如果真的面试问到了估计也是一脸懵

今日任务:

JSON


先认识一下JSON和JSONL文件

记得之前在面试KIMI的时候,面试官就给我出了JSONL和EXCEL转换的手撕代码题,而那个时候,我连什么是JSONL都不知道,然后毫无疑问的挂了。

JSON文件

  • 使用大括号 {} 表示对象,使用方括号 [] 表示数组,用来将所有的对象包装在一起。

  • 整个文件是一个有效的 JSON 对象或数组。

  • 适合存储结构化的数据,如配置文件、API 响应等。

  • 一次性读取整个文件,解析成一个 JSON 对象,可以随机访问其中的数据。

{
"class": "Year 1",
"student" :[
{"name": "John", "age": 30},
{"name": "Jane", "age": 25},
{"name": "Bob", "age": 40}
]}

JSONL文件

  • 每行是一个独立的有效 JSON 对象。

  • 每行之间没有逗号或其他分隔符。

  • 适合存储每行为独立记录的数据,如日志、传感器数据、日志行等。

  • 逐行读取文件,逐行解析 JSON 对象,一次处理一行的数据。

{"name": "John", "age": 30}
{"name": "Jane", "age": 25}
{"name": "Bob", "age": 40}

从JSON文件加载数据

read_json() 用于从 JSON 格式的数据中读取并加载为一个 DataFrame。它支持从 JSON 文件、JSON 字符串或 JSON 网址中加载数据。

import pandas as pddf = pd.read_json(path_or_buffer,      # JSON 文件路径、JSON 字符串或 URLorient=None,         # JSON 数据的结构方式,默认是 'columns',会根据文件自动判断dtype=None,          # 强制指定列的数据类型convert_axes=True,   # 是否转换行列索引convert_dates=True,  # 是否将日期解析为日期类型keep_default_na=True # 是否保留默认的缺失值标记
)

常见的 orient 参数选项:

orient 值JSON 格式示例描述
split{"index":["a","b"],"columns":["A","B"],"data":[[1,2],[3,4]]}使用键 indexcolumns 和 data 结构
records[{"A":1,"B":2},{"A":3,"B":4}]每个记录是一个字典,表示一行数据
index{"a":{"A":1,"B":2},"b":{"A":3,"B":4}}使用索引为键,值为字典的方式
columns{"A":{"a":1,"b":3},"B":{"a":2,"b":4}}使用列名为键,值为字典的方式
values[[1,2],[3,4]]只返回数据,不包括索引和列名

从URL中读取JSON数据

import pandas as pdURL = 'https://static.jyshare.com/download/sites.json'
df = pd.read_json(URL)
print(df)

JSON字符串

import pandas as pd# JSON 字符串
json_data = '''
[{"Name": "Alice", "Age": 25, "City": "New York"},{"Name": "Bob", "Age": 30, "City": "Los Angeles"},{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''# 从 JSON 字符串读取数据
df = pd.read_json(json_data)print(df)#如果是下面这样
json_data = [{"Name": "Alice", "Age": 25, "City": "New York"},{"Name": "Bob", "Age": 30, "City": "Los Angeles"},{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]#用df = pd.read_json(json_data)就会报错
df = pd.DataFrame(json_data)

如果JSON内容很多,直接print(df)可能会打印不全,用print(df.to_srting())会打印完整数据


JSON数据内嵌

假设JSON数据中包含列表

# nested_list.json
{"school_name": "ABC primary school","class": "Year 1","students": [{"id": "A001","name": "Tom","math": 60,"physics": 66,"chemistry": 61},{"id": "A002","name": "James","math": 89,"physics": 76,"chemistry": 51},{"id": "A003","name": "Jenny","math": 79,"physics": 90,"chemistry": 78}]
}

如果直接read_json

import pandas as pddf = pd.read_json('nested_list.json')print(df)

结果是

          school_name   class                                           students
0  ABC primary school  Year 1  {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1  ABC primary school  Year 1  {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2  ABC primary school  Year 1  {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...

如果我们想把students的数据转换成DataFrame,可以使用json_normalize()将折叠的JSON数据展平。record_path用于提取深层嵌套的列表,如果students列表嵌套在info这个字典中,则record_path可以写成,下文的meta参数同理。

record_path=['info', 'students']  # 多层路径用列表表示:先找 info,再找 students
import pandas as pd
import json# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:data = json.loads(f.read())# 展平数据
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)

结果就是:

     id   name  math  physics  chemistry
0  A001    Tom    60       66         61
1  A002  James    89       76         51
2  A003  Jenny    79       90         78

如果要将school_name 和 class 也作为列,则使用'meta'参数

import pandas as pd
import json# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:data = json.loads(f.read())# 展平数据
df_nested_list = pd.json_normalize(data, record_path =['students'], meta=['school_name', 'class']
)
print(df_nested_list)

可以看到school_name 和 class添加到了最后两列,且三行数据是一样的

     id   name  math  physics  chemistry         school_name   class
0  A001    Tom    60       66         61  ABC primary school  Year 1
1  A002  James    89       76         51  ABC primary school  Year 1
2  A003  Jenny    79       90         78  ABC primary school  Year 1

如果JSON文件中既包含列表,又包含字典,如

{"school_name": "local primary school","class": "Year 1","info": {"president": "John Kasich","address": "ABC road, London, UK","contacts": {"email": "admin@e.com","tel": "123456789"}},"students": [{"id": "A001","name": "Tom","math": 60,"physics": 66,"chemistry": 61},{"id": "A002","name": "James","math": 89,"physics": 76,"chemistry": 51},{"id": "A003","name": "Jenny","math": 79,"physics": 90,"chemistry": 78}]
}

现在将students和info.president和info.contats.tel构成dataframe

import pandas as pd
import json# 使用 Python JSON 模块载入数据
with open('nested_mix.json','r') as f:data = json.loads(f.read())df = pd.json_normalize(data, record_path =['students'], meta=['class',['info', 'president'], #表示先找info,再找president['info', 'contacts', 'tel']#表示先找info,再找contacts,再找tel]
)print(df)

输出就是

     id   name  math  physics  chemistry   class info.president info.contacts.tel
0  A001    Tom    60       66         61  Year 1    John Kasich         123456789
1  A002  James    89       76         51  Year 1    John Kasich         123456789
2  A003  Jenny    79       90         78  Year 1    John Kasich         123456789

其他更复杂嵌套,用到glom模块,建议直接问AI吧

不用 record_path的一个小实验

nested_list.json
{"class": "一班","students": [{"name": "张三", "age": 18},{"name": "李四", "age": 19}]
}test.py
import pandas as pd
import json# 先使用json模块读取文件
with open('nested_list.json', 'r') as f:data = json.load(f)
df = pd.json_normalize(data)
print(df['students'])

会输出

0    [{'name': '张三', 'age': 18}, {'name': '李四', 'age': 19}]
Name: students, dtype: object

因为JSON结构是顶层字典包含students键,所以会直接将顶层键students解析为一列,而students键是一个列表,所以students对应的值就是整个列表

  • df['class'] 对应的值是字符串 "一班"

  • df['students'] 对应的值是整个学生列表(未被进一步展开,因为它本身就是顶层键)

如果不用json.load,直接pd.read_json('nested_list.json'),则会报错,因为'nested_list.json'里含有复杂嵌套,无法解析为dataframe


输出为JSON文件

DataFrame.to_json() - 将 DataFrame 转换为 JSON 数据,并指定JSON的结构化方式

df.to_json(path_or_buffer=None,    # 输出的文件路径或文件对象,如果是 None 则返回 JSON 字符串orient=None,            # JSON 格式方式,支持 'split', 'records', 'index', 'columns', 'values'date_format=None,       # 日期格式,支持 'epoch', 'iso'default_handler=None,   # 自定义非标准类型的处理函数lines=False,            # 是否将每行数据作为一行(适用于 'records' 或 'split')encoding='utf-8'        # 编码格式
)

默认用columns格式转换JSON

import pandas as pd# 创建 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['New York', 'Los Angeles', 'Chicago']
})#路径为空,则不会生成JSON文件,返回 JSON 字符串
json_str = df.to_json()print(json_str)'''
{"Name":{"0":"Alice","1":"Bob","2":"Charlie"},"Age":{"0":25,"1":30,"2":35},"City":{"0":"New York","1":"Los Angeles","2":"Chicago"}}
'''

用records模式审

import pandas as pd# 创建 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['New York', 'Los Angeles', 'Chicago']
})# 将 DataFrame 转换为 JSON 文件,指定 orient='records'
#路径不为空
df.to_json('data.json', orient='records', lines=True)'''
{"Name":"Alice","Age":25,"City":"New York"},
{"Name":"Bob","Age":30,"City":"Los Angeles"},  
{"Name":"Charlie","Age":35,"City":"Chicago"}
'''

JSON稍微有点复杂,主要是嵌套

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95094.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring框架集成Kakfa的方式

Spring框架集成Kakfa的方式 springboot集成kafka的方式 添加maven依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency&g…

【蓝桥杯 2024 省 Python B】缴纳过路费

【蓝桥杯 2024 省 Python B】缴纳过路费 蓝桥杯专栏&#xff1a;2024 省 Python B 算法竞赛&#xff1a;图论&#xff0c;生成树&#xff0c;并查集&#xff0c;组合计数&#xff0c;kruskal 最小生成树&#xff0c;乘法原理 题目链接&#xff1a;洛谷 【蓝桥杯 2024 省 Python…

个性化导航新体验:cpolar让Dashy支持语音控制

文章目录简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问用 cpolar 让 Dashy 管理个人导航站就是这么简单&#xff01;三步轻松搞定&#xff1a;在电脑上安装 Dashy&#xff0c;拖拽添加常用网站&#xff0c;运行 cpolar 生成远程访问链接。这个方法不仅免费&…

SQL学习记录

基本的&#xff0c;增、删&#xff0c;改insert into table_name (列1, 列2,...) VALUES (值1, 值2,....)Delete from 表 where keyvalueupdate 表 set keyvalue,keyvalue where keyvalue查用的最多whereSELECT prod_name, prod_price FROM Products WHERE vend idDLLO1OR ve…

零基础学C++,函数篇~

C基础学习&#xff08;DAY_06&#xff09;函数1. 函数的定义与使用2. 函数参数传递3. 变量的声明周期4. 函数的其他特性5. 函数的嵌套与递归函数 1. 函数的定义与使用 ​ 在设计程序时&#xff0c;如果一段代码重复进行某种操作或者完成一个特定的功能&#xff0c;就应该将这…

react+vite+ts 组件模板

1.创建项目npm create vitelatest my-app --template react-ts2.配置项目 tsconfig.json{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020", "DOM", "D…

C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region

C语言中的输出参数详解&#xff1a;以 alloc_chrdev_region 为例 在学习 C 语言函数调用时&#xff0c;我们常常接触到“输入参数”&#xff0c;比如把一个数字传给函数&#xff0c;让函数帮我们算出结果。但有时候可能会发现&#xff0c;有些函数除了返回值之外&#xff0c;还…

机器视觉学习-day09-图像矫正

1 仿射变换与透视变换1.1 仿射变换之前在图像旋转实验中已经接触过仿射变换&#xff0c;仿射变换是一个二维坐标系到另一个二维坐标系的过程&#xff0c;在仿射变换中符合直线的平直性和平行性。1.2 透视变换透视变换是把一个图像投影到一个新的视平面的过程。在现实世界中&…

杰理ac791获取之前版本sdk

很惭愧&#xff0c;一个如此简单的问题卡了这么久&#xff0c;运动战的本质就是多找线索&#xff0c;多尝试

基于轴重转移补偿和多轴协调的粘着控制方法研究

基于轴重转移补偿和多轴协调的粘着控制方法研究 1. 论文标题 基于轴重转移补偿和多轴协调的粘着控制方法研究 2. 内容概括 该论文针对重载电力机车在复杂轨面条件下易发生空转的问题,提出了一种新型粘着控制方法。传统方法仅考虑单轴粘着利用而忽略轴间关系,本文设计了包…

台达 PLC 软件导入 EDS 文件后不能通过 PDO 控制的解决方法

一、功能及注意事项 1.功能说明&#xff1a;通过修改 EDS 文件处理台达 PLC 软件导入 EDS 文件后不能通过 PDO 控制的解决方法 2.注意事项&#xff1a;1).此文档只针对立迈胜 CANopen 通讯一体化电机&#xff1b; 2).EDS 文件可以用记事本打开&#xff1b; 二、EDS 文件修改 IS…

Python库2——Matplotlib2

上一篇文章主要介绍了Matplotlib库中的Pyplot模块中几大常见图像的绘制&#xff0c;包括自行修改图像的属性&#xff0c;在绘制图像时会自动创建一个图形窗口来展现这些图像。本节内容继续讲讲这个&#xff08;Figure&#xff09;图像窗口即其一些常见用法。 其他python库链接…

AI生成思维导图和AI生成Excel公式

AI生成思维导图和AI生成Excel公式 AI 生成思维导图和 AI 生成 Excel 公式是一个完全免费的 AI 办公合集网站。 它完全免费&#xff0c;一个网站支持多个实用 AI 办公功能&#xff0c;包括&#xff1a;免费 AI Excel 公式生成器、输入 Excel 公式解释含义、AI Excel 助手、Exc…

java中的VO、DAO、BO、PO、DO、DTO

VO、DAO、BO 等对象在了解这里 po、vo、dao、之前先介绍下 MVC 开发模式M层负责与数据库打交道&#xff1b;C层负责业务逻辑的编写&#xff1b;V层负责给用户展示&#xff08;针对于前后端不分离的项目&#xff0c;不分离项目那种编写模版的方式&#xff0c;理解V的概念更直观&…

More Effective C++ 条款16:牢记80-20准则(Remember the 80-20 Rule)

More Effective C 条款16&#xff1a;牢记80-20准则&#xff08;Remember the 80-20 Rule&#xff09;核心思想&#xff1a;软件性能优化遵循帕累托原则&#xff08;Pareto Principle&#xff09;&#xff0c;即大约80%的性能提升来自于优化20%的关键代码。识别并专注于这些关键…

Java中对泛型的理解

一、泛型是什么&#xff1f;1. 定义&#xff1a; 泛型允许你在定义类、接口或方法时使用类型参数&#xff08;Type Parameter&#xff09;。在使用时&#xff08;如声明变量、创建实例时&#xff09;&#xff0c;再用具体的类型实参&#xff08;Type Argument&#xff09; 替换…

Redis开发06:使用stackexchange.redis库结合WebAPI对redis进行增删改查

一、接口写法namespace WebApplication1.Controllers.Redis {[ApiController][Route("/api/[controller]")]public class RedisService : IRedisService{private readonly IConnectionMultiplexer _redis;//StackExchange.Redis库自带接口public RedisService(IConne…

【前端教程】从零开始学JavaScript交互:7个经典事件处理案例解析

在网页开发中&#xff0c;交互性是提升用户体验的关键。JavaScript作为网页交互的核心语言&#xff0c;通过事件处理机制让静态页面"动"了起来。本文将通过7个经典案例&#xff0c;从简单到复杂&#xff0c;逐步讲解JavaScript事件处理的实现方法和应用场景。 案例1&…

内存模型(Memory Model)是什么?

内存模型(Memory Model)是什么? 内存模型是一个非常深刻且核心的计算机科学概念。 核心摘要 内存模型是一个契约或协议,它精确定义了: 一个线程对共享内存的写操作,如何以及何时对其他线程可见。 内存操作(读/写)可以被重新排序的程度。 它连接了硬件(CPU如何执行指令…

在 MyBatis 中oracle基本数值类型的 JDBC 类型映射

基本数值类型的 JDBC 类型Java 类型JDBC 类型 (jdbcType)说明int / IntegerINTEGER标准整数类型long / LongBIGINT大整数类型short / ShortSMALLINT小整数类型float / FloatFLOAT单精度浮点数double / DoubleDOUBLE双精度浮点数java.math.BigDecimalDECIMAL高精度小数&#xff…