有人会帮我优化我的解决方案从json文件加载数据使用json规范和pd协议?我的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"
}
]
}
]我必须从“state”加载数据,并且必须在每个城市上有日期(取自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个jsons需要很长的时间,更不用说5000。有什么方法可以优化我的解决方案吗?
发布于 2019-12-18 21:41:37
您所使用的许多函数在这个目的上似乎很复杂,因为它们在某种程度上是复杂的。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)https://stackoverflow.com/questions/59383661
复制相似问题