将大型 .jsons 文件加载到 Pandas 数据框中

数据挖掘 Python 熊猫 json
2021-10-09 06:01:07

我正在尝试将大型 jsons 文件(2.5 GB)加载到 Pandas 数据框中。由于文件过大会 pandas.read_json()导致内存错误。

因此,我试图这样阅读它:

S_DIR = r'path-to-directory'

with open(os.path.join(S_DIR, 'file.jsons')) as json_file:
    data = json_file.readlines()
    data = list(map(json.loads, data))

df = pd.DataFrame(data)

然而,这只是继续运行,减慢/崩溃我的电脑。

最有效的方法是什么?

最终目标是拥有这个大型 file.jsons 数据集的子集(样本)。

谢谢

1个回答

有几种方法可以更有效地做到这一点:

JSON 模块,然后进入 Pandas

您可以尝试使用 json 模块直接将 JSON 文件作为 JSON 对象(即读入 Python 字典)读取:

import json
import pandas as pd

data = json.load(open("your_file.json", "r"))
df = pd.DataFrame.from_dict(data, orient="index")

orient="index"根据 JSON 文件的形状/映射,可能需要使用。

使用 Python查看有关JSON 文件的深度教程。

直接使用熊猫

你说这个选项会给你一个内存错误,但是有一个选项可以帮助你解决这个问题。传递lines=True,然后使用参数指定在一个块中读取多少行chunksize以下将返回一个您可以迭代的对象,并且每次迭代将只读取文件的 5 行:

df = pd.read_json("test.json", orient="records", lines=True, chunksize=5)

注意这里的 JSON 文件必须是records格式,这意味着每一行都是list like这让 Pandas 知道它可以一次可靠地读取chunksize=5行。这是有关行分隔的 JSON 文件的相关文档简而言之,该文件应该使用以下内容编写:df.to_json(..., orient="records", line=True).

Pandas 不仅为您抽象了一些手动部分,它还提供了更多选项,例如正确转换日期、指定每列的数据类型等。查看相关文档

查看Pandas 用户指南文档中的一个小代码示例。

另一个节省内存的技巧 - 使用生成器

有一种很好的方法可以在任何给定时间仅将一个文件的内容保存在内存中,使用具有惰性求值的 Python 生成器。这是了解它们的起点。

在您的示例中,它可能如下所示:

import os

# Get a list of files
files = sorted(os.listdir("your_folder"))
# Load each file individually in a generator expression
df = pd.concat(pd.read_json(file, orient="index") for f in files, ...)

仅在读取所有文件后才进行连接。在我离开.... 文档pd.concat在这里