TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

用Python处理JSON嵌套结构:json_normalize平铺技巧全解析

2025-07-21
/
0 评论
/
2 阅读
/
正在检测是否收录...
07/21

用Python处理JSON嵌套结构:json_normalize平铺技巧全解析

JSON作为现代Web开发中最常用的数据交换格式,其嵌套结构经常让数据分析师和开发者感到头疼。Python中的json_normalize函数是处理这类嵌套数据的利器。本文将深入探讨如何巧妙运用这一工具,将复杂的JSON结构"拍平"为规整的表格形式。

为什么需要处理JSON嵌套结构?

在API调用、网络爬虫或大数据处理场景中,我们获取的JSON数据往往具有多层嵌套。例如:

json { "article": { "title": "Python数据处理技巧", "metadata": { "keywords": ["Python", "JSON", "pandas"], "author": { "name": "张伟", "email": "zhangwei@example.com" } }, "content": "在处理复杂JSON时..." } }

这种结构虽然表达力强,但直接分析非常不便。我们需要将其转换为表格形式,才能进行有效的数据分析和可视化。

json_normalize基础用法

json_normalize是pandas库中的一个函数,专门用于将嵌套的JSON对象转换为平面表格。

python
import pandas as pd
from pandas import json_normalize

data = {
"id": 1,
"info": {
"name": "示例数据",
"details": {
"category": "技术",
"views": 1500
}
}
}

df = json_normalize(data)
print(df)

输出结果:
id info.name info.details.category info.details.views 0 1 示例数据 技术 1500

高级平铺技巧

1. 控制字段分隔符

默认使用点号(.)作为分隔符,可以通过sep参数自定义:

python df = json_normalize(data, sep='_')

2. 处理JSON数组

当JSON中包含数组时,json_normalize会自动展开:

python
data = {
"posts": [
{"title": "文章1", "tags": ["Python", "数据分析"]},
{"title": "文章2", "tags": ["机器学习"]}
]
}

df = json_normalize(data, 'posts', ['tags'])

3. 指定要展开的字段

使用record_path指定要展开的主字段,meta指定要保留的元数据:

python
data = {
"status": "success",
"data": [
{
"id": 1,
"attributes": {
"title": "文章A",
"author": "李四"
}
},
{
"id": 2,
"attributes": {
"title": "文章B",
"author": "王五"
}
}
]
}

df = json_normalize(data, 'data',
meta=[['attributes', 'title'],
['attributes', 'author']])

4. 处理复杂嵌套结构

对于多层嵌套的JSON,可以结合多个json_normalize调用:

python

先展开第一层

df1 = json_normalize(data, 'data')

再展开attributes

df2 = json_normalize(df1['attributes'].tolist())

合并结果

result = pd.concat([df1.drop('attributes', axis=1), df2], axis=1)

实战案例:处理API返回数据

假设我们从某内容平台API获取了如下数据:

json { "status": 200, "results": [ { "article_id": "A1001", "title": "Python进阶技巧", "stats": { "views": 1250, "claps": 85, "comments": 23 }, "author": { "id": "U2001", "name": "王技术", "followers": 1200 }, "tags": ["编程", "Python", "开发"] }, { "article_id": "A1002", "title": "数据分析实战", "stats": { "views": 980, "claps": 64, "comments": 15 }, "author": { "id": "U2002", "name": "李数据", "followers": 850 }, "tags": ["数据分析", "可视化", "Python"] } ] }

处理代码:

python
import pandas as pd
from pandas import json_normalize

假设data是API返回的JSON数据

df = jsonnormalize( data['results'], meta=[ 'articleid',
'title',
['stats', 'views'],
['stats', 'claps'],
['stats', 'comments'],
['author', 'id'],
['author', 'name'],
['author', 'followers']
],
record_path='tags'
)

重命名列

df = df.rename(columns={
0: 'tag',
'stats.views': 'views',
'stats.claps': 'claps',
'stats.comments': 'comments',
'author.id': 'authorid', 'author.name': 'authorname',
'author.followers': 'author_followers'
})

print(df)

性能优化技巧

处理大型JSON数据集时,性能至关重要:

  1. 限制展开的层级:使用max_level参数控制展开深度
  2. 选择性展开:只展开需要的字段,减少内存消耗
  3. 分批处理:对于超大数据,考虑分块读取和处理
  4. 使用dtypes:提前指定列数据类型,避免自动推断开销

python df = json_normalize( data, max_level=2, # 只展开两层嵌套 meta=['id', 'name'], # 只保留关键元数据 dtype={'views': 'int32', 'claps': 'int16'} # 指定数据类型 )

常见问题与解决方案

问题1:字段名称冲突

当不同层级的字段名相同时,可能导致列名冲突。解决方案:

python

添加前缀区分

df = json_normalize(data, sep='__')

问题2:缺失数据处理

JSON中某些字段可能在某些记录中缺失。使用errors参数控制行为:

python df = json_normalize(data, errors='ignore') # 忽略无法解析的字段

问题3:日期时间转换

JSON中的日期字符串需要特殊处理:

python df['publish_date'] = pd.to_datetime(df['publish_date'])

结语

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/33446/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 强强强
    2025-04-07
  2. jesse
    2025-01-16
  3. sowxkkxwwk
    2024-11-20
  4. zpzscldkea
    2024-11-20
  5. bruvoaaiju
    2024-11-14

标签云