Python - 解析嵌套的 Json

时间:2021-04-01 16:37:21

标签: python json pandas

我有一个 json 文件,我正在尝试解析并只获取两个值。 “时间戳”和“值”。 这是我的 json 文件示例:

    {'totalCount': 1,
 'nextPageKey': None,
 'result': [{'metricId': 'builtin:synthetic.browser.event.visuallyComplete.load',
   'data': [{'dimensions': ['SYNTHETIC_TEST_STEP-123456'],
     'dimensionMap': {'dt.entity.synthetic_test_step': 'SYNTHETIC_TEST_STEP-123456'},
     'timestamps': [
      1596326400000,
      1616976000000,
      1617062400000,
      1617148800000,
      1617235200000],
     'values': [
      3880.834490740741,
      3879.6458333333335,
      3826.3645833333335,
      3890.871527777778,
      3876.8199643493763]}]}]}

我尝试对熊猫使用方法:

    import pandas as pd
    pdp = pd.json_normalize(PDPjson['result'],['data'])

所以我可以将它放入数据框中,但我正在获取带有日期列表的列和带有值列表的列。 enter image description here

我想要得到的只是一个包含两列、时间戳和值的数据框。

我如何从这里执行此操作?

2 个答案:

答案 0 :(得分:1)

您可以在 timestampsvalues 上应用 Series.explode

pdp = pdp[['timestamps', 'values']].apply(pd.Series.explode).reset_index(drop=True)

#       timestamps       values
# 0  1596326400000  3880.834491
# 1  1616976000000  3879.645833
# 2  1617062400000  3826.364583
# 3  1617148800000  3890.871528
# 4  1617235200000  3876.819964

答案 1 :(得分:1)

我按如下方式创建了您的 JSON 对象:

txt = '''\
{ "totalCount": 1,
  "nextPageKey": "None",
  "result": [{"metricId": "builtin:synthetic.browser.event.visuallyComplete.load",
    "data": [{"dimensions": ["SYNTHETIC_TEST_STEP-123456"],
      "dimensionMap": {"dt.entity.synthetic_test_step": "SYNTHETIC_TEST_STEP-123456"},
      "timestamps": [ 1596326400000, 1616976000000, 1617062400000,
        1617148800000, 1617235200000],
      "values": [ 3880.834490740741, 3879.6458333333335, 3826.3645833333335,
        3890.871527777778, 3876.8199643493763]}]}]}'''
PDPjson = json.loads(txt)

然后我和你一样从 json_normalize 开始:

pdp = pd.json_normalize(PDPjson['result'], 'data')

缺少的步骤是:

result = pdp[['timestamps', 'values']].apply(lambda col: col.explode())\
    .reset_index(drop=True)

结果是:

      timestamps   values
0  1596326400000  3880.83
1  1616976000000  3879.65
2  1617062400000  3826.36
3  1617148800000  3890.87
4  1617235200000  3876.82

不要担心 values 列的较小精度,它只是 Jupyter Notebook 呈现数据的方式。

当你跑步时result.iloc[0,1] 你会得到:

3880.834490740741

完全精确。