1. ホーム
  2. パイソン

[解決済み】JSONからpandasのDataFrameへの変換

2022-04-18 10:11:14

質問

以下のように緯度経度座標で指定された経路に沿った標高データをgoogle map 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)

で、以下が私の希望です。

これが可能かどうかはわかりませんが、主に私が探しているのは、標高、緯度、経度のデータをpandas dataframeにまとめることができる方法です(派手な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

は、緯度、経度、標高のカラムを持つデータフレームを終了します。

解決方法は?

を使うことで、簡単に解決することができました。 json_normalize() に含まれる pandas 1.01 .

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

これは、Google Maps APIから取得したjsonデータで、きれいにフラット化されたデータフレームを提供します。