将json_normalize用于带有列表的结构化多级词典

时间:2018-04-15 14:26:29

标签: python python-3.x pandas

我使用以下迭代方法成功地将数据从JSON文件(根据以下示例构建)转移到三列['tag', 'time', 'score'] DataFrame中:

for k, v in enumerate(my_request['content']):
    for k1, v1 in enumerate(v['data']['score']):
        df.loc[len(df)] = [v['tag_id'], v1['time'], v1['value']]

然而,虽然这最终实现了预期的结果,但是需要花费大量时间来迭代具有相同结构的较大文件。我假设迭代方法不是解决此类问题的理想方法。改为使用pandas.io.json.json_normalize,我尝试了以下内容:

result = json_normalize(my_request, ['content'], ['data', 'score', ['time', 'value']])

返回KeyError: ("Try running with errors='ignore' as key %s is not always present", KeyError('data',))。我相信我误解了json_normalize上的pandas文档,并且无法弄清楚我应该如何传递参数。

有人能指出我正确的方向吗?

(或者使用 errors='ignore' 返回 ValueError: Conflicting metadata name data, need distinguishing prefix 。)

JSON结构

 {  
   'content':[  
      {  
         'data':{  
            'score':[  
               {  
                  'time':'2015-03-01 00:00:30',
                  'value':75.0
               },
               {  
                  'time':'2015-03-01 23:50:30',
                  'value':58.0
               }
            ]
         },
         'tag_id':320676
      },
      {  
         'data':{  
            'score':[  
               {  
                  'time':'2015-03-01 00:00:25',
                  'value':78.0
               },
               {  
                  'time':'2015-03-01 00:05:25',
                  'value':57.0
               }
            ]
         },
         'tag_id':320677
      }
   ],
   'meta':None,
   'requested':'2018-04-15 13:00:00'
}

1 个答案:

答案 0 :(得分:1)

  

然而,虽然这最终实现了预期的结果,但是需要花费大量时间来迭代具有相同结构的较大文件。

我建议如下:

  1. 检查问题是否与您的迭代追加有关。熊猫不是很擅长顺序添加行。这段代码怎么样:

    tups = []
    for k, v in enumerate(my_request['content']):
        for k1, v1 in enumerate(v['data']['score']):
            tups.append(v['tag_id'], v1['time'], v1['value'])
    df = pd.DataFrame(tups, columns=['tag_id', 'time', 'value])
    
  2. 如果上述内容不够快,请检查它是否是

    的JSON解析部分
    for k, v in enumerate(my_request['content']):
        for k1, v1 in enumerate(v['data']['score']):
            v['tag_id'], v1['time'], v1['value']
    

    1.很可能足够快。但是,如果没有,请检查ujson对于这种情况是否更快。