Доступ к файлу JSON с несколькими иерархическими уровнями - PullRequest
0 голосов
/ 03 июня 2018

У меня есть файл 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"
     }
  }
   ]
}

Я пытаюсь извлечь значения "sensorType" или "value" с помощью Python.Используя приведенный ниже код 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 , не могли бы вы помочь с этой проблемой?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Вы можете использовать метод python dict get:

Вы можете проверить все доступные методы любого объекта, напечатав dir (объект):

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

для панд вы можете создать новый фрейм данных и обновить его с помощью цикла 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
0 голосов
/ 03 июня 2018

rows - это список объектов, попробуйте это:

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

или, если у вас много объектов в списке rows, вам нужно использовать for loop statment

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

Обновление Чтобы поместить эти значения в фрейм данных более питоническим способом, это

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

print(df1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...