【问题标题】:Accessing JSON File with Multiple Hierarchical Layers访问具有多个层次结构的 JSON 文件
【发布时间】:2018-11-12 23:34:39
【问题描述】:

我有一个格式如下的 JSON 文件:

{  
   "total_rows":10000,
   "offset":0,
   "rows":[  
      {  
     "id":"005584833b8e2063f04ff713",
     "key":"00558433b8e2063f04ff713",
     "value":{  
        "rev":"1-8137baa51a2f335b0215ba9d08"
     },
     "doc":{  
        "_id":"0055842eb0063f04ff713",
        "_rev":"1-8137baa51a2f335b0215ba9d08",
        "value":1,
        "date":"2017-04-07T12:38:06.336Z",
        "date_inmilli":1491568686336,
        "sensorType":"sensor",
        "date":"2017-04-07T12:38:06.458Z"
     }
  }
   ]
}

我正在尝试使用 Python 提取 "sensorType""value" 的值。 使用下面的 R 代码,我能够正确地得到结果:

library(jsonlite)
df <- fromJSON("file.json")
df$rows$doc$sensorType

但是使用 Python pandas,当我尝试使用以下代码提取值时出现错误:

import pandas as pd
df = pd.read_json("file.json")
df['rows']['doc']['sensorType']

我正在努力学习Python,你能帮忙解决这个问题吗?提前致谢。

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    rows 是一个对象列表试试这个:

    df['rows'][0]['doc']['sensorType']
    

    或者如果rows 列表中有很多对象,则需要使用for loop statment

    for row in df['rows']:
        print(row['doc']['sensorType'])
    

    更新 将这些值放入数据框更 Pythonic 的方式是这样

    df1 = pd.DataFrame([row['doc']['sensorType'] for row in df['rows']])
    
    print(df1)
    

    【讨论】:

    • 您好,非常感谢您的回答!最终我会将这些值放入数据框中,下面的代码是 Python 中的正确方法还是有更优化的方法? df1 = [] for row in df['rows']: df1.append((row['doc']['sensorType'])) df1=pd.DataFrame(df1)
    • @Solijoli 你可以使用list comprehension 一个简单的foor loop 最快,我更新我的答案
    【解决方案2】:

    你可以使用 python dict get 方法:

    您可以通过打印 dir (object) 来检查任何对象的所有可用方法:

    print(dir(dict))
    
    ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
    

    用途:

    data={
       "total_rows":10000,
       "offset":0,
       "rows":[
          {
         "id":"005584833b8e2063f04ff713",
         "key":"00558433b8e2063f04ff713",
         "value":{
            "rev":"1-8137baa51a2f335b0215ba9d08"
         },
         "doc":{
            "_id":"0055842eb0063f04ff713",
            "_rev":"1-8137baa51a2f335b0215ba9d08",
            "value":1,
            "date":"2017-04-07T12:38:06.336Z",
            "date_inmilli":1491568686336,
            "sensorType":"sensor",
         }
      }
       ]
    }
    
    
    print(data.get('rows')[0].get('doc').get('sensorType'))
    

    输出:

    sensor
    

    对于 pandas,您可以创建一个新的数据框并使用类似这样的 for 循环对其进行更新:

    raw_data = []
    
    raw_data.append(data.get('rows')[0].get('doc').get('sensorType'))
    
    df = pd.DataFrame(raw_data, columns = ['sensorType'])
    
    print(df)
    

    输出:

      sensorType
    0     sensor
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多