当前位置: 首页 > java >正文

Pandas - JSON格式数据操作实践

作者:唐叔在学习
专栏:唐叔学python

大家好,我是唐叔!今天咱们来聊聊Pandas这个数据分析利器在处理JSON数据时的妙用。JSON作为一种轻量级的数据交换格式,在Web开发和数据分析中无处不在。掌握Pandas与JSON的互转技巧,能让你在数据处理时事半功倍!

文章目录

    • 一、Pandas读取JSON数据
      • 1. 从本地文件读取JSON
      • 2. 从HTTP请求读取JSON数据
    • 二、将Pandas数据转换为JSON
      • 1. 基本转换方法
      • 2. 不同格式的JSON输出
      • 3. 处理中文编码问题
    • 三、实战案例:获取豆瓣电影Top50
    • 四、常见问题解答
    • 五、总结

一、Pandas读取JSON数据

1. 从本地文件读取JSON

首先,咱们看看如何从本地文件读取JSON数据。Pandas提供了read_json()函数,使用起来非常简单:

import pandas as pd# 从本地文件读取JSON
df = pd.read_json('data.json')  # 假设有一个data.json文件
print(df.head())

在这里插入图片描述

2. 从HTTP请求读取JSON数据

实际工作中,我们更多会遇到从API接口获取JSON数据的情况。这时候需要结合requests库来获取数据:

import pandas as pd
import requests# 发送HTTP GET请求获取JSON数据
response = requests.get('https://api.example.com/data')
data = response.json()  # 将响应转换为Python字典# 将字典转换为DataFrame
df = pd.DataFrame(data)
print(df.head())

如果JSON数据结构比较复杂,比如嵌套了多层,可以使用json_normalize()函数来展平:

from pandas import json_normalize# 假设获取的JSON数据有嵌套结构
complex_data = {"total": 2,"users": [{"name": "张三","age": 25,"address": {"city": "北京","street": "朝阳区"}},{"name": "李四","age": 30,"address": {"city": "上海","street": "浦东新区"}}]
}# 展平嵌套的JSON结构
df = json_normalize(complex_data, 'users', meta=['total'])
print(df)

在这里插入图片描述

二、将Pandas数据转换为JSON

1. 基本转换方法

把DataFrame转换为JSON同样简单,使用to_json()方法即可:

# 创建一个示例DataFrame
data = {'姓名': ['张三', '李四', '王五'],'年龄': [25, 30, 35],'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)# 转换为JSON字符串
json_str = df.to_json()
print(json_str)# 转换为JSON文件
df.to_json('output.json', orient='records', force_ascii=False)

在这里插入图片描述

2. 不同格式的JSON输出

Pandas提供了多种JSON输出格式,通过orient参数控制:

# 按记录输出(最常用的格式)
print(df.to_json(orient='records'))# 按索引输出
print(df.to_json(orient='index'))# 按列输出
print(df.to_json(orient='columns'))# 按值输出
print(df.to_json(orient='values'))

3. 处理中文编码问题

默认情况下,中文会被转换为Unicode编码。如果想保留原始中文,可以设置force_ascii=False

print(df.to_json(orient='records', force_ascii=False))

PS:验证了使用PyCharm的控制台打印没效果,但是输出文件是可以做到保留原始中文的。

三、实战案例:获取豆瓣电影Top50

豆瓣提供了公开的API接口(需要申请API key),但为了演示,我们先使用简单的网页版接口:

import pandas as pd
import requests
from bs4 import BeautifulSoup# 获取豆瓣电影Top50
def get_douban_movies():headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}movies = []# 获取前2页数据for i in range(0, 2):url = f'https://movie.douban.com/top250?start={i}'response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'html.parser')for item in soup.find_all('div', class_='item'):title = item.find('span', class_='title').textrating = item.find('span', class_='rating_num').texteval_num = item.find('div', class_='bd').find_all('span')[-2].text.replace('人评价', '')movies.append({'title': title,'rating': rating,'eval_num': eval_num})return movies# 获取数据
movies_data = get_douban_movies()
df = pd.DataFrame(movies_data)
print(df)

在这里插入图片描述

四、常见问题解答

Q1:为什么我的JSON数据读取后格式不对?

A:JSON数据结构千变万化,建议先用print(data)查看原始结构,再决定如何转换。复杂的嵌套结构可能需要json_normalize来处理。

Q2:如何只转换DataFrame的某几列为JSON?

A:可以先选择需要的列,再转换:

df[['姓名', '年龄']].to_json()

Q3:处理大型JSON文件时内存不足怎么办?

A:可以尝试:

  1. 使用chunksize参数分块读取
  2. 使用ijson库流式处理大型JSON文件

五、总结

今天唐叔带大家学习了:

  1. 使用read_json()读取本地JSON文件
  2. 结合requests获取HTTP接口的JSON数据
  3. 使用json_normalize处理复杂嵌套结构
  4. 使用to_json()将DataFrame转换为JSON
  5. 处理中文编码问题
  6. 一个完整的天气数据分析案例

记住,数据处理的关键在于理解数据结构。拿到JSON数据后,先打印出来看看结构,再决定如何处理。

好了,今天的分享就到这里。如果你觉得有用,别忘了点赞、收藏、关注三连!有什么问题欢迎在评论区留言,唐叔会一一解答。


唐叔小贴士:JSON数据格式虽然灵活,但缺乏严格的结构定义。在实际项目中,建议使用JSON Schema来定义数据格式,这样可以减少很多数据处理时的麻烦。

往期Python文章推荐

  • Pandas - Python爬虫数据处理分析神器
  • BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!
http://www.xdnf.cn/news/15933.html

相关文章:

  • 深入详解随机森林在医学图像质量评估中的应用与实现细节
  • git_guide
  • 关于JVM
  • 开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机
  • QT6 源,七章对话框与多窗体(6) 颜色对话框 QColorDialog :本类的属性,信号函数,静态成员函数,以及源代码
  • “hidden act“:“gelu“在bert中作用
  • Tomcat的部署、单体架构、session会话、spring
  • LeetCode|Day21|204. 计数质数|Python刷题笔记
  • DelayQueue延迟队列的使用
  • 分布式定时任务系列13:死循环是任务触发的银弹?
  • Jmeter如何做接口测试?
  • 基于 STM32 的数字闹钟系统 Proteus 仿真设计与实现
  • JavaWeb笔记四
  • 【VASP】VASP 机器学习力场(MLFF)实战
  • 超越基于角色的手术领域建模:手术室中的可泛化再识别|文献速递-医学影像算法文献分享
  • 神经网络——非线性激活
  • 深入解析 SymPy 中的符号计算:导数与变量替换的实践指南
  • 【设计模式】观察者模式 (发布-订阅模式,模型-视图模式,源-监听器模式,从属者模式)
  • OpenEuler 22.03 系统上安装配置gitlab runner
  • 基于Python的多传感器融合的障碍物检测与避障演示
  • Jetpack ViewModel LiveData:现代Android架构组件的核心力量
  • 【Vue进阶学习笔记】实现图片懒加载
  • k8s的calico无法启动报错解决
  • Docker实践:使用Docker部署blog轻量级博客系统
  • 【Java + Vue 实现图片上传后 导出图片及Excel 并压缩为zip压缩包】
  • 【跨国数仓迁移最佳实践2】MaxCompute SQL执行引擎对复杂类型处理全面重构,保障客户从BigQuery平滑迁移
  • IDEA 同时修改某个区域内所有相同变量名
  • 深入解析IP协议:组成、地址管理与路由选择
  • Freemarker实现下载word可能遇到的问题
  • docker--挂载