使用 JSON 规范化 + PD Concat 加载 JSON 文件



有人会帮助我优化使用 JSON 规范化和 PD concat 从 JSON 文件加载数据的解决方案吗? 我的 5k json 文件如下:

[
{
"id": {
"number": 2121",
"exp" : "1",
"state": "California"
},
"state": [
{
"city": "San Francisco",
"pm": "17",
"spot": "2"
},
{
"city": "San Diego",
"pm": "14",
"spot": "1"
}
]
},
{
"id": {
"number": "2122",
"exp" : "1"
"state": "California",
},
"state": [
{
"city: "San Jose",
"pm": "15",
"spot": "1"
}
]
}
]

我必须从"状态"加载数据,并且必须在每个城市都有日期(取自 json 文件名(。我的解决方案是

json_paths = 'my files_directory' 
jsfiles = glob.glob(os.path.join(json_paths, "*.json"))
main_df = pd.DataFrame() 
for file in jsfiles:
df = pd.read_json(file)
for i in df['state']:
df2 = pd.concat([pd.DataFrame(json_normalize(i))], ignore_index=False, sort = False)
df2['date'] = file 
main_df = pd.concat([main_df, df2])

加载 1000 个 json 需要很长时间,更不用说 5000 个了。有什么方法可以优化我的解决方案吗?

您正在使用的许多函数似乎为此目的很复杂,因为它们在某种程度上是。json_normalize()用于展平字典(删除嵌套(,因为您的 JSON 状态对象已经是平面的,因此您不需要这样做。如果您的 JSON 文件已经采用方便的格式进行读取,则使用pd.read_json很好,但您的格式不是。

考虑到这些事情,最简单的方法是首先在 Python 中解析每个 JSON 文件,以便将要对应于单个行的数据获取到字典中,并保留所有这些文件的列表。

我还使用pathlib.Path对象来清理通配和文件名提取。

像这样的事情是你想要做的:

import pandas as pd
from pathlib import Path
import json
# each dict in states corresponds to a row
states = []
# you can glob directly on pathlib.Path objects
for file in Path("my files_directory").glob("*.json"):
# load json data
with open(file) as jsonf:
data = json.load(jsonf)
# add the date from the filename stem to each dict, and append to list
for result in data:
for state in result["state"]:
state["date"] = file.stem
states.append(state)
# create a df where each row corresponds to each dict in states
df = pd.DataFrame(states)

最新更新