广告

数据分析必学:Python 嵌套 JSON 处理技巧与 json_normalize 实战教程

数据分析中的嵌套 JSON 挖掘与提取技巧

嵌套结构的常见格式

在实际数据源中,JSON 常常以字典嵌套字典、列表嵌套对象等形式呈现。数据分析必学:Python 嵌套 JSON 处理技巧与 json_normalize 实战教程 的核心议题就是从这些嵌套结构中提取可分析的表格数据。

例如,最常见的三种形式包括:单层嵌套对象、对象中包含数组,以及数组中嵌套对象。理解每种形式的访问路径有助于后续数据抽取的健壮性。

数据分析必学:Python 嵌套 JSON 处理技巧与 json_normalize 实战教程

# 示例:三种嵌套形式
sample = {"user": {"id": 1, "name": "Alice"},"orders": [{"order_id": 100, "amount": 23.5},{"order_id": 101, "amount": 7.0}]
}

在上述示例中,访问 nested user 信息和 orders 列表的方式不同,需要分别使用字典取值和列表遍历实现。

如何识别嵌套的深度与难点

数据分析中,嵌套的深度直接影响解析的复杂度。深度越大,越需要采用分步提取与数据展平策略,避免一次性全量展开导致内存压力。

常见难点包括:动态键名、可选字段、以及嵌套列表里的对象结构不固定。对字段存在性进行安全检查是稳健解析的关键

Python 实战:使用 json 模块解析嵌套 JSON

读取与转换 JSON 字符串

在 Python 中,最基本的解析入口来自于 json 模块的 loads 与 load,前者用于字符串,后者用于文件对象。

将原始文本转为字典后,第一步通常是进行简短的字段抽取与类型校验,以确保后续处理的一致性。

import json# 字符串到对象
text = '{"user": {"id": 42, "name": "Bob"}, "orders": [{"order_id": 1, "amount": 9.99}] }'
data = json.loads(text)# 简单字段校验
if isinstance(data, dict) and "user" in data:user_id = data["user"].get("id")orders = data.get("orders", [])

同时,可以将 JSON 对象直接写入文件,以方便后续日志和审计,保持数据的可追溯性。

处理嵌套字段的高效策略

对于嵌套字段,逐层提取比直接强制扁平化更稳妥,尤其在字段数量不固定时。

常用技巧包括:使用字典推导提取目标字段、结合默认值处理缺失字段,以及通过递归函数对深层结构逐步展开。

def get_nested(data, path, default=None):cur = datafor key in path:if isinstance(cur, dict) and key in cur:cur = cur[key]else:return defaultreturn cur# 取 user.name
name = get_nested(data, ["user", "name"], default="unknown")

通过 json_normalize 将嵌套扁平化成表格

pandas.json_normalize 的核心参数

pandas 的 json_normalize 是将嵌套 JSON 转换为扁平 DataFrame 的核心工具,它通过 record_path、meta、errors 等参数来定义扁平化的规则。

核心思想是:指定嵌套列表作为记录源,同时保留元数据字段,从而得到结构化的二维表。

import pandas as pddata = {"store": "A","employees": [{"id": 1, "name": "John", "skills": [{"name": "Python", "level": "expert"}]},{"id": 2, "name": "Jane", "skills": [{"name": "SQL", "level": "intermediate"}]}]
}# 将嵌套的 employees 列表扁平化,同时保留 store 字段
df = pd.json_normalize(data, record_path=["employees", "skills"],meta=[("store",), ("employees", "id"), ("employees", "name")]
)

在这个例子中,record_path 指定了要展开的嵌套列表,而 meta 列表保留了父级字段以便进行关联分析。

处理嵌套列表与合并元数据

对于多层嵌套,可以多次使用 json_normalize 的 record_path 与 meta 来逐步展平,并通过参数 flatten 或者 explode 进一步控制结构。

注意,在某些版本中,直接使用嵌套的多维键可能报错,需要先转换键路径形式,如使用元组来表达路径。

# 更复杂的嵌套:包含多层 record_path
nested_data = {"catalog": {"sections": [{"title": "A", "items": [{"sku": "A1"}, {"sku": "A2"}]},{"title": "B", "items": [{"sku": "B1"}]}]}
}df2 = pd.json_normalize(nested_data,record_path=["catalog", "sections", "items"],meta=[["catalog", "sections", 0, "title"]]
)

完整工作流案例:从加载到导出

环境准备与数据加载

在实际工作流中,你通常会先搭建一个可重复的环境,将依赖版本固定,以确保结果可复现。

数据加载阶段,优先使用流式读取或分块读取以应对大规模 JSON,并对读取过程中的异常进行捕获。

import json
import pandas as pd# 假设数据来自一个文件
with open("data.json", "r", encoding="utf-8") as f:raw = json.load(f)

数据清洗与扁平化

清洗阶段要关注缺失值、类型不一致、以及重复字段。先统一字段命名和数据类型是后续分析的基石

随后,使用 json_normalize 进行扁平化,记录关键维度以便统计分析

# 直接扁平化示例
flat = pd.json_normalize(raw, sep="_")# 保存到 CSV
flat.to_csv("output.csv", index=False)

进阶要点:性能、健壮性与常见坑

大规模嵌套 JSON 的分块处理

处理海量 JSON 时,应采用分块读取与局部内存清理策略,避免一次性载入造成内存溢出。

可以结合 迭代器与生成器逐步构建 DataFrame,以平衡性能与内存

def iter_json_lines(file_path):with open(file_path, "r", encoding="utf-8") as f:for line in f:yield json.loads(line)# 将多块数据逐步拼接
rows = []
for item in iter_json_lines("big_data.jsonl"):rows.append(item)
df = pd.json_normalize(rows)

异常处理与日志记录

在实际工程中,完善的异常处理和日志记录是排错的关键,尤其在数据格式不可控时。

要规划的要点包括:对解析失败的记录进行标记、记录错误栈信息、以及输出清晰的诊断报告

广告

后端开发标签