You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升Pandas中JSON Lines文件的json_normalize处理速度?

高效处理JSON Lines嵌套数据的优化方案

嘿,这个问题我太有共鸣了!逐行调用json_normalize再拼接的方式,在数据量上去之后确实会因为频繁创建小DataFrame、反复执行concat而拖慢速度——毕竟pandas处理小数据块的开销真的不小。下面给你几个实测有效的高效方案:

方案1:批量加载后统一归一化(最推荐)

与其逐行处理每个JSON对象并生成小DataFrame,不如先把所有数据一次性加载成Python列表,再用json_normalize批量处理,最后直接生成完整的DataFrame。这样能彻底避免大量小DataFrame的创建和拼接开销。

import pandas as pd
import json

# 一次性读取所有JSON行到内存列表
with open("/home/igor/data/feed.jsonl") as json_file:
    all_data = [json.loads(line) for line in json_file]

# 对整个列表执行一次归一化,直接生成最终DataFrame
df = pd.json_normalize(all_data)

如果你的数据量特别大,一次性加载到内存会有压力,可以改成分块批量处理:

import pandas as pd
import json

chunk_size = 10000  # 根据内存情况调整每块的行数
result_dfs = []

with open("/home/igor/data/feed.jsonl") as json_file:
    current_chunk = []
    for line_num, line in enumerate(json_file, 1):
        current_chunk.append(json.loads(line))
        # 每积累到指定行数,就处理一次块
        if line_num % chunk_size == 0:
            result_dfs.append(pd.json_normalize(current_chunk))
            current_chunk = []
    # 处理最后剩余的不足一块的数据
    if current_chunk:
        result_dfs.append(pd.json_normalize(current_chunk))

# 最后拼接所有块的结果
final_df = pd.concat(result_dfs, ignore_index=True)

方案2:用pandas内置的read_json快速读取后处理

pandas的read_json方法是经过优化的,比手动逐行json.loads更快。你可以先直接读取JSON Lines文件得到初始DataFrame,再针对嵌套列单独做归一化:

import pandas as pd

# 直接读取JSON Lines文件,lines=True表示每行是一个JSON对象
df = pd.read_json("/home/igor/data/feed.jsonl", lines=True)

# 假设你的嵌套数据在名为`nested_data`的列中,单独归一化该列
nested_df = pd.json_normalize(df["nested_data"])
# 将归一化后的嵌套数据和原DataFrame合并(去掉原嵌套列)
final_df = pd.concat([df.drop("nested_data", axis=1), nested_df], axis=1)

这个方案的优势是读取阶段的速度更快,而且只针对需要归一化的嵌套列操作,避免了对整个数据的重复处理。

方案3:用更快的JSON解析库提速

标准库的json模块解析速度不算顶尖,你可以换成用C实现的orjson库(速度比内置json快3-5倍),进一步减少数据加载的时间:

首先安装orjson:

pip install orjson

然后修改代码:

import pandas as pd
import orjson

with open("/home/igor/data/feed.jsonl", "rb") as json_file:
    all_data = [orjson.loads(line) for line in json_file]

df = pd.json_normalize(all_data)

这个方案可以和前面的批量/分块方案结合,进一步提升整体处理速度。


内容的提问来源于stack exchange,提问作者Igor Rivin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:08