我试图做的是提取海拔数据从谷歌地图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)

这就是我想要的:

我不确定这是否可能,但主要是我在寻找的是一种方法,能够把海拔,纬度和经度数据放在一个熊猫数据框架(不需要有花哨的多行头)。

如果有人可以帮助或提供一些建议,这些数据的工作将是伟大的!如果你看不出我以前没有太多使用json数据…

编辑:

这个方法并不那么吸引人,但似乎很有效:

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

最终数据框架有列纬度,经度,海拔


当前回答

使用Json加载文件,并使用dataframe .from_dict函数将其转换为熊猫数据帧

import json
import pandas as pd
json_string = '{ "name":"John", "age":30, "car":"None" }'

a_json = json.loads(json_string)
print(a_json)

dataframe = pd.DataFrame.from_dict(a_json)

其他回答

下面是一个小实用程序类,它可以将JSON转换为DataFrame和DataFrame:希望这对您有帮助。

# -*- coding: utf-8 -*-
from pandas.io.json import json_normalize

class DFConverter:

    #Converts the input JSON to a DataFrame
    def convertToDF(self,dfJSON):
        return(json_normalize(dfJSON))

    #Converts the input DataFrame to JSON 
    def convertToJSON(self, df):
        resultJSON = df.to_json(orient='records')
        return(resultJSON)

你可以先在Python字典中导入json数据:

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可以直接从字典中创建一个DataFrame(我已经很久没有使用它了:p)

我使用pandas 1.01中包含的json_normalize()找到了一个快速而简单的解决方案。

from urllib2 import Request, urlopen
import json

import pandas as pd    

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)
df = pd.json_normalize(data['results'])

这给了一个很好的扁平数据框架与json数据,我从谷歌地图API。

一旦你有了被接受的答案所获得的扁平数据帧,你可以让列成为一个MultiIndex(“花式多行标题”),就像这样:

df.columns = pd.MultiIndex.from_tuples([tuple(c.split('.')) for c in df.columns])

只是已接受答案的新版本,如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'])