當前位置: 首頁>>技術問答>>正文


python – JSON字段轉換為Pandas DataFrame

問題描述

代碼實現的是沿著經度和緯度坐標指定的路徑從google maps API中提取海拔數據,如下所示:

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"',
 '}']

當放入DataFrame時,我得到的是:

pd.read_json(elevations)

而我真正想要的是:

 

下麵方法代碼不太優雅,但可以起作用:

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

結果是具有經度,緯度和海拔列的DataFrame,還有什麽更好的辦法呢

 

最佳方案

使用最新版本的 Pandas 0.13中包含的json_normalize函數可以輕鬆實現所需的解決方案。

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'])

這提供了一個很好的扁平化DataFrame,其中包含我從Google Maps API獲得的json數據。

 

次佳方案

試試下麵這個段代碼:

# 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)

希望能幫助到你 :)

 

第三種方案

最佳答案的新版本,因為python3.x不支持urllib2

from requests import request
import json
from pandas.io.json import json_normalize

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

 
google maps


參考資料

 

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/4364.html,未經允許,請勿轉載。