Lo que intento hacer es extraer datos de elevación de una API de Google Maps a lo largo de una ruta especificada por las coordenadas de latitud y longitud de la siguiente manera:
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()
Esto me da una información que se ve así:
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"',
'}']
cuando lo pongo como DataFrame aquí es lo que obtengo:
pd.read_json(elevations)
y esto es lo que quiero:
No estoy seguro de si esto es posible, pero principalmente lo que estoy buscando es una forma de poder juntar los datos de elevación, latitud y longitud en un marco de datos de pandas (no tiene que tener encabezados de mutilina sofisticados).
Si alguien puede ayudar o dar algún consejo sobre cómo trabajar con estos datos, ¡sería genial! Si no puede decir que no he trabajado mucho con datos json antes ...
EDITAR:
Este método no es tan atractivo pero parece funcionar:
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
termina el marco de datos que tiene columnas de latitud, longitud, elevación
fuente
Respuestas:
Encontré una solución rápida y fácil para lo que quería usar
json_normalize()
incluidapandas 1.01
.Esto proporciona un marco de datos plano y agradable con los datos json que obtuve de la API de Google Maps.
fuente
pd.DataFrame.from_records()
como se describe aquí stackoverflow.com/a/33020669/1137803Mira este recorte.
Espero eso ayude :)
fuente
Primero puede importar sus datos json en un diccionario Python:
Luego modifique los datos sobre la marcha:
Reconstruir cadena json:
Finalmente :
Probablemente, también puede evitar volcar datos en una cadena, supongo que Panda puede crear directamente un DataFrame desde un diccionario (no lo he usado desde hace mucho tiempo: p)
fuente
Solo una nueva versión de la respuesta aceptada, ya
python3.x
que no admiteurllib2
fuente
El problema es que tiene varias columnas en el marco de datos que contienen dictos con dictos más pequeños dentro de ellos. Json útil a menudo está muy anidado. He estado escribiendo pequeñas funciones que extraen la información que quiero en una nueva columna. De esa manera lo tengo en el formato que quiero usar.
fuente
La respuesta aceptada tiene algunos problemas de funcionamiento, por lo que quiero compartir mi código que no se basa en urllib2:
Salida:
PD: API es para precios de electricidad daneses
fuente
Aquí hay una pequeña clase de utilidad que convierte JSON a DataFrame y viceversa: Espero que esto sea útil.
fuente
La solución de billmanH me ayudó pero no funcionó hasta que cambié de:
a:
aquí está el resto, la conversión a un diccionario es útil para trabajar con datos json.
fuente
fuente
Una vez que haya
DataFrame
obtenido el aplanado obtenido por la respuesta aceptada, puede hacer que las columnas aMultiIndex
("encabezado multilínea elegante") así:fuente