Pandas json_normalize 无法在 Python 中使用大型 JSON 文件

Posted

技术标签:

【中文标题】Pandas json_normalize 无法在 Python 中使用大型 JSON 文件【英文标题】:Pandas json_normalize Not Working With Large JSON File In Python 【发布时间】:2014-08-19 00:16:29 【问题描述】:

我正在尝试使用 json_normalize() 函数将一个大的(大约 900 MB)json 文件标准化为 pandas DataFrame。这适用于我正在处理的所有其他文件(大小范围约为 150-500 MB),尽管它们每个都需要几分钟才能完成。然而,有了这个文件,它似乎永远运行并且永远不会完成。我曾尝试在规范化之前使用 read_json() 将 json 文件直接读取到 DataFrame 中,以及使用 json.loads() 从文件中加载 json。两种方法具有相同的结果。我使用的代码是:

import pandas as pd
import json

path = mf.getPath('dataFile.json')
testTrials = json.loads(open(path)) #testTrials = pd.read_json(path)
testTrials = json_normalize(testTrials['rows'])

【问题讨论】:

您的系统有多少内存?你的数据结构有多嵌套?您需要将所有数据加载到框架中吗?鉴于nested_to_record(由json_normalize 使用)为每个dict 做一个深拷贝,你将需要大量内存,我认为超过3-4Gb。查看多少 RAM 使用 500MB 文件进行估算。 @Rho 它限制了可用的 8 GB 内存。我使用了一种使用 ijson 逐行读取的新方法,这允许该过程完成但需要 30 分钟。 【参考方案1】:

您可以将大 JSON 文件拆分为多个块,并一次处理一个块。像这样的代码:

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

dfs = []
chunk_size = 1000
for json in grouper(jsons,chunk_size):
    df = json_normalize(json)
    dfs.append(df)
pd.concat(dfs) 

【讨论】:

以上是关于Pandas json_normalize 无法在 Python 中使用大型 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 json_normalize 在 Pandas 中重复列标题?

Pandas json_normalize 会产生令人困惑的“KeyError”消息?

pandas json_normalize 展平嵌套字典

pandas json_normalize KeyError

Pandas json_normalize 返回 KeyError

在带有数组的嵌套 Json 上使用 Pandas json_normalize