天天看點

python pandas dataframe 轉json_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時,我得到的是:

python pandas dataframe 轉json_python - JSON字段轉換為Pandas DataFrame

pd.read_json(elevations)

而我真正想要的是:

python pandas dataframe 轉json_python - JSON字段轉換為Pandas DataFrame

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

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,還有什麼更好的辦法呢?

python pandas dataframe 轉json_python - JSON字段轉換為Pandas 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'])

python pandas dataframe 轉json_python - JSON字段轉換為Pandas DataFrame

參考資料