2 嵌套字典 Json 格式使用 Json_norminalize 使用 python

Posted

技术标签:

【中文标题】2 嵌套字典 Json 格式使用 Json_norminalize 使用 python【英文标题】:2 Nested Dictionaries Json format using Json_norminalize using python 【发布时间】:2021-09-07 18:12:21 【问题描述】:

您好,我正在尝试检索此数据,其中有 2 个嵌套字典:


"metadata": 
    "stations": [
        
            "id": "S108",
            "device_id": "S108",
            "name": "Kuala Lumpur",
            "location": 
                "latitude": 3.1390,
                "longitude": 101.6869
            
        ,
        
            "id": "S118",
            "device_id": "S118",
            "name": "Bukit Bintang",
            "location": 
                "latitude":3.1468,
                "longitude": 101.7113
            
        
    ],
    "reading_type": "DBT 1M F",
    "reading_unit": "deg C"
,
"items": [
    
        "timestamp": "2021-06-20T15:05:00+08:00",
        "readings": [
            
                "station_id": "S108",
                "value": 32.6
            ,
            
                "station_id": "S118",
                "value": 30.3
            
        ]
    
]

我想得到这样的结果: Result

我尝试了几种方法:

data = airtemp.json()
df = pd.json_normalize(data,record_path=['metadata', 'stations'])
df


data = airtemp.json()
df1 = pd.json_normalize(data,record_path=['items','readings'])
df1

有没有一种方法可以使用 json_norminalize 形成一个包含 station_id、名称、纬度、经度、时间戳和值的表,而不会分成 2 个表?

非常感谢!

【问题讨论】:

【参考方案1】:

你可以merge你创建的两个数据框:

import pandas as pd


data = 
  "metadata": 
    "stations": [
      
        "id": "S108",
        "device_id": "S108",
        "name": "Kuala Lumpur",
        "location": 
          "latitude": 3.1390,
          "longitude": 101.6869
        
      ,
      
        "id": "S118",
        "device_id": "S118",
        "name": "Bukit Bintang",
        "location": 
          "latitude": 3.1468,
          "longitude": 101.7113
        
      
    ],
    "reading_type": "DBT 1M F",
    "reading_unit": "deg C"
  ,
  "items": [
    
      "timestamp": "2021-06-20T15:05:00+08:00",
      "readings": [
        
          "station_id": "S108",
          "value": 32.6
        ,
        
          "station_id": "S118",
          "value": 30.3
        
      ]
    
  ]


stations = pd.json_normalize(data, record_path=['metadata', 'stations'])
readings = pd.json_normalize(data, record_path=['items', 'readings'])
result = stations.merge(readings, left_on='id', right_on='station_id')
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(result)

输出:

   id      device_id     name    location.latitude  location.longitude  \
0  S108      S108   Kuala Lumpur             3.1390            101.6869   
1  S118      S118  Bukit Bintang             3.1468            101.7113   

     station_id  value  
0       S108   32.6  
1       S118   30.3  

您提供的数据中只有一个timestamp,因此您必须单独获取它。

【讨论】:

哇!!这看起来很棒!我正在尝试从 json 文件格式中提取时间戳,并且一直无法提取时间戳。有没有办法提取现有代码中的时间戳?非常抱歉,我应该在问题陈述中说明。 数据中是否只有一个时间戳,或者是否有多个时间戳,即更多项目和每个项目的时间戳?如果只有一个使用timestamp = data['items'][0]['timestamp']

以上是关于2 嵌套字典 Json 格式使用 Json_norminalize 使用 python的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃

从字典列表中创建嵌套的 json 对象

python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

Python Flatten 用 Pandas 将嵌套字典 JSON 相乘

iOS Swift 中的嵌套字典