开发者社区> 问答> 正文

使用json normalize + pd concat加载json文件

有人会帮助我优化我的解决方案加载数据从json文件使用json正常化和pd concat? 我的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个json需要很长时间,更不用说装载5000个json了。有什么方法可以优化我的解决方案吗? 问题来源StackOverflow 地址:/questions/59383661/loading-json-files-using-json-normalize-pd-concat

展开
收起
kun坤 2019-12-27 10:12:47 579 0
1 条回答
写回答
取消 提交回答
  • 您正在使用的许多函数看起来都很复杂,因为它们在某种程度上确实如此。json_normalize()用于平铺字典(删除嵌套),因为JSON状态对象已经是平铺的,所以不需要这样做。用pd。如果您的JSON文件已经具有方便阅读的格式,read_json是可以的,但是您的格式不是。 记住这些事情之后,最简单的方法是首先用Python解析每个JSON文件,这样就可以获得与字典中的单行对应的数据,并保留所有这些数据的列表。 我还使用了pathlib。路径对象来清除通配符和文件名提取。 像这样的事情是你想要做的:

    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)
    
    2019-12-27 10:12:56
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
File Format Benchmark - Avro, JSON, ORC, & Parquet 立即下载
The Value of Exploratory Data 立即下载
低代码开发师(初级)实战教程 立即下载