代码之家  ›  专栏  ›  技术社区  ›  Serge de Gosson de Varennes

json\u normalize不会读取所有数据

  •  0
  • Serge de Gosson de Varennes  · 技术社区  · 4 年前

    我有一个 json 文件,我想平展和检索到一个熊猫数据帧的所有信息。这个 json文件 文件如下所示:

    jsonstr = {
      "calculation": {
        "id": "3k3k3k3kwk3kwk",
        "Id": 23,
        "submissionDate": 1622428064679,
        "serverVersion": "3.3.5.6.r",
        "tag": [
          {
            "code": "qq4059331155113278",
            "manual": {
              "location": {
                "x": 26.5717,
                "y": 59.4313,
                "z": 0.0,
                "floor": 0
              },
              "timestamp": 1599486138000
            },
            "device": null,
            "measurements": [
              {
                "Address": "D_333",
                "subcell": "",
                "frequency": 14.0,
                "dfId": 0
              },
              {
                "trxAddress": "D_334",
                "subcell": "",
                "frequency": 11.0,
                "dfId": 0
              }]
        }]
    }
    }
    

    现在,像往常一样,我做下面的事情。我以为这会返回所有的“字段”,包括 id , Id submissionDate 等等

    import os, json
    import pandas as pd
    import numpy as np
    import glob
    pd.set_option('display.max_columns', None)
    
    file = './Testjson.json'
    #file = './jsondumps/ff80818178f93bd90179ab51781e1c95.json'
    with open(file) as json_string:
        jsonstr = json.load(json_string)
    
    labels = pd.json_normalize(jsonstr, record_path=['calculation','tag'])
    

    但事实上,它的回报是:

       code device  \
    0  qq4059331155113278   None   
    
                                            measurements  manual.location.x  \
    0  [{'Address': 'D_333', 'subcell': '', 'frequenc...            26.5717   
    
       manual.location.y  manual.location.z  manual.location.floor  \
    0            59.4313                0.0                      0   
    
       manual.timestamp  
    0     1599486138000
    

    尝试以下方法

    labels = pd.json_normalize(jsonstr, record_path=['calculation','tag'], meta=['id', 'Id'])
    

    返回错误:

    KeyError: 'id'
    

    这是有道理的。但一开始我做错了什么?为什么我不能把所有的田地都挖下来 calculation

    任何见解都很好!

    1 回复  |  直到 4 年前
        1
  •  2
  •   Jonathan Leon    4 年前

    你的语法在元参数上有点偏离。 id Id 在数据帧的末尾。

    flatten_json . 它是一个非常好的库,可以与嵌套的json一起使用。

    pd.json_normalize(jsonstr, record_path=['calculation','tag'],  meta=[['calculation','id'],['calculation','Id']])
    
                     code device                                       measurements  manual.location.x  manual.location.y  manual.location.z  manual.location.floor  manual.timestamp  calculation.id calculation.Id
    0  qq4059331155113278   null  [{'Address': 'D_333', 'subcell': '', 'frequenc...            26.5717            59.4313                0.0                      0     1599486138000  3k3k3k3kwk3kwk             23