如何提升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
相关产品推荐
相关产品推荐

