从大型 JSON 中读取特定字段并导入 Pandas 数据框

Posted

技术标签:

【中文标题】从大型 JSON 中读取特定字段并导入 Pandas 数据框【英文标题】:Read only specific fields from large JSON and import into a Pandas Dataframe 【发布时间】:2019-06-05 01:49:38 【问题描述】:

我有一个文件夹,其中包含或多或少 10 个大小在 500 到 1000 Mb 之间的 json 文件。 每个文件包含大约 1.000.000 行,例如 loffowling:

 
    "dateTime": '2019-01-10 01:01:000.0000'
    "cat": 2
    "description": 'This description'
    "mail": 'mail@mail.com'
    "decision":["first":"01", "second":"02", "third":"03","first":"04", "second":"05", "third":"06"] 
    "Field001": 'data001'
    "Field002": 'data002'
    "Field003": 'data003'
    ...
    "Field999": 'data999'

我的目标是使用 pandas 对其进行分析,因此我想将来自所有文件的数据保存到 Dataframe 中。 如果我循环所有文件 Python 崩溃,因为我没有可用资源来管理数据。

就我的目的而言,我只需要一个包含所有文件中两列 catdateTime 的 Dataframe,我认为这比我尝试读取的所有列的整个 Dataframe 更轻这些具有以下 sn-p 的两列:

注意:目前我只处理一个文件,当我获得快速阅读器代码时,我将循环到所有其他文件(A.json、B.json、...)

import pandas as pd
import json
import os.path
from glob import glob

cols = ['cat', 'dateTime']
df = pd.DataFrame(columns=cols)

file_name='this_is_my_path/File_A.json'
with open(file_name, encoding='latin-1') as f:
    for line in f:
        data=json.loads(line)
        lst_dict=('cat':data['cat'], 'dateTime':data['dateTime'])
        df = df.append(lst_dict, ignore_index=True)

代码可以运行,但速度非常慢,所以一个文件需要一个多小时,同时读取所有文件并存储到 Dataframe 中通常需要 8-10 分钟。

有没有办法只读取两个特定列并以更快的方式附加到数据框?

我尝试读取所有 JSON 文件并将其存储到 Dataframe 中,然后删除除“cat”和“dateTime”之外的所有列,但对于我的 MacBook 来说似乎太重了。

【问题讨论】:

我认为这是最快的方法,但我真的不明白你说这个代码需要一个小时的聚会。但是使用其他代码需要 8-10 分钟?我认为 8-10 分钟 sfor 大文件是相当合理的。 【参考方案1】:

这会有帮助吗?

第 1 步。 从 pandas 读取您的 json 文件 “pandas.read_json()” 第2步。 然后从数据框中过滤掉你的 2 列。

如果您仍然遇到任何问题,请告诉我。 谢谢

【讨论】:

这不是一个通用的解决方案。我面临类似的问题,第一个命令pandas.read_json() 已经超出内存。 chunksize 选项也无济于事,因为您无法对 'JsonReader' 对象执行聚合操作。 @fcpenha 同样,这个问题的重点是由于资源限制,不要导入所有列。【参考方案2】:

我遇到了同样的问题。我发现将 dict 附加到 DataFrame 非常非常慢。而是将值提取为列表。在我的情况下,它需要 14 秒而不是 2 小时。

cols = ['cat', 'dateTime']
data = []
file_name = 'this_is_my_path/File_A.json'

with open(file_name, encoding='latin-1') as f:
    for line in f:
        doc = json.loads(line)
        lst = [doc['cat'], doc['dateTime']]
        data.append(lst)

df = pd.DataFrame(data=data, columns=cols)

【讨论】:

我猜当我们用太多的 json 工作时,我们开始将数据视为文档 ^^

以上是关于从大型 JSON 中读取特定字段并导入 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 json 数据中读取特定字段? [关闭]

使用 ijson 从特定键读取 json 数据

如何将SalesForce数据导入Python Panda数据帧

PySpark - 如何输出带有特定字段的 JSON?

从特定 JSON 字段中提取数据,将其用作变量,并更新字段值?

macmatlab导入大型csv