首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用json正常化+ pd concat加载json文件

使用json正常化+ pd concat加载json文件
EN

Stack Overflow用户
提问于 2019-12-17 23:42:12
回答 1查看 957关注 0票数 0

有人会帮我优化我的解决方案从json文件加载数据使用json规范和pd协议?我的5k json文件如下:

代码语言:javascript
复制
[
  {
    "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文件名)。我的解决办法是

代码语言:javascript
复制
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。有什么方法可以优化我的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-18 21:41:37

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

考虑到这些问题,最简单的方法就是首先用Python解析每个JSON文件,以便将想要对应于单个行的数据放入字典中,并保存所有这些数据的列表。

此外,我还使用pathlib.Path对象来清理全局和文件名提取。

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59383661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档