JSON в кадр данных pandas


то, что я пытаюсь сделать, это извлечь данные о высоте из API Карт google по пути, указанному координатами широты и долготы следующим образом:

from urllib2 import Request, urlopen
import json

path1 = '42.974049,-81.205203|42.974298,-81.195755'
request=Request('http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false')
response = urlopen(request)
elevations = response.read()

это дает мне данные, которые выглядят так:

elevations.splitlines()

['{',
 '   "results" : [',
 '      {',
 '         "elevation" : 243.3462677001953,',
 '         "location" : {',
 '            "lat" : 42.974049,',
 '            "lng" : -81.205203',
 '         },',
 '         "resolution" : 19.08790397644043',
 '      },',
 '      {',
 '         "elevation" : 244.1318664550781,',
 '         "location" : {',
 '            "lat" : 42.974298,',
 '            "lng" : -81.19575500000001',
 '         },',
 '         "resolution" : 19.08790397644043',
 '      }',
 '   ],',
 '   "status" : "OK"',
 '}']

при вводе в качестве фрейма данных вот что я получаю:

pd.read_json(elevations)

и вот что я хочу:

Я не уверен, что это возможно, но в основном то, что я ищу, - это способ быть в состоянии чтобы поместить данные о высоте, широте и долготе вместе в фрейм данных pandas (не обязательно иметь причудливые заголовки mutiline).

если кто-то может помочь или дать несколько советов по работе с этими данными, что было бы здорово! Если вы не можете сказать, что я раньше не работал с данными json...

EDIT:

этот метод не так уж привлекателен, но, похоже, работает:

data = json.loads(elevations)
lat,lng,el = [],[],[]
for result in data['results']:
    lat.append(result[u'location'][u'lat'])
    lng.append(result[u'location'][u'lng'])
    el.append(result[u'elevation'])
df = pd.DataFrame([lat,lng,el]).T

заканчивается фрейм данных, имеющий столбцы широта, долгота, высота

4 69

4 ответа:

Я нашел быстрое и простое решение для того, что я хотел, используя функцию json_normalize, включенную в последний выпуск pandas 0.13.

from urllib2 import Request, urlopen
import json
from pandas.io.json import json_normalize

path1 = '42.974049,-81.205203|42.974298,-81.195755'
request=Request('http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false')
response = urlopen(request)
elevations = response.read()
data = json.loads(elevations)
json_normalize(data['results'])

Это дает хороший плоский фрейм данных с данными json, которые я получил от Google maps API.

проверьте этот отрывок.

# reading the JSON data using json.load()
file = 'data.json'
with open(file) as train_file:
    dict_train = json.load(train_file)

# converting json dataset from dictionary to dataframe
train = pd.DataFrame.from_dict(dict_train, orient='index')
train.reset_index(level=0, inplace=True)

надеюсь, что это помогает :)

вы можете сначала импортировать данные json в Python dictionnary:

data = json.loads(elevations)

затем изменить данные на лету:

for result in data['results']:
    result[u'lat']=result[u'location'][u'lat']
    result[u'lng']=result[u'location'][u'lng']
    del result[u'location']

перестроить строку json:

elevations = json.dumps(data)

и наконец :

pd.read_json(elevations)

вы также можете, вероятно, избежать сброса данных обратно в строку, я предполагаю, что Panda может напрямую создать фрейм данных из словаря (я не использовал его с давних пор :p)

проблема в том, что у вас в кадре данных, которые содержат предсказывает с меньшим предсказывает внутри них несколько столбцов. Полезный Json часто сильно вложен. Я писал небольшие функции, которые вытягивают информацию, которую я хочу, в новый столбец. Таким образом, у меня есть это в формате, который я хочу использовать.

for row in range(len(data)):
    #First I load the dict (one at a time)
    n = data.loc[row,'dict_column']
    #Now I make a new column that pulls out the data that I want.
    data.loc[row,'new_column'] = n.get('key')