Ce que j'essaie de faire, c'est d'extraire les données d'altitude d'une API google maps le long d'un chemin spécifié par les coordonnées de latitude et de longitude comme suit:
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()
Cela me donne une donnée qui ressemble à ceci:
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"',
'}']
lors de la mise en tant que DataFrame, voici ce que j'obtiens:
pd.read_json(elevations)
et voici ce que je veux:
Je ne sais pas si cela est possible, mais ce que je recherche principalement, c'est un moyen de pouvoir rassembler les données d'élévation, de latitude et de longitude dans un cadre de données pandas (il n'est pas nécessaire d'avoir des en-têtes mutilines fantaisie).
Si quelqu'un peut aider ou donner des conseils sur l'utilisation de ces données, ce serait formidable! Si vous ne pouvez pas dire que je n'ai pas beaucoup travaillé avec les données json auparavant ...
ÉDITER:
Cette méthode n'est pas très attrayante mais semble fonctionner:
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
finit par dataframe avec des colonnes latitude, longitude, altitude
la source
Réponses:
J'ai trouvé une solution rapide et facile à ce que je voulais en utilisant
json_normalize()
incluspandas 1.01
.Cela donne une belle trame de données aplatie avec les données json que j'ai obtenues de l'API Google Maps.
la source
pd.DataFrame.from_records()
comme décrit ici stackoverflow.com/a/33020669/1137803Regardez ce snip.
J'espère que ça aide :)
la source
Vous pouvez d'abord importer vos données json dans un dictionnaire Python:
Puis modifiez les données à la volée:
Reconstruire la chaîne json:
Finalement :
Vous pouvez, aussi, probablement éviter de vider les données en une chaîne, je suppose que Panda peut créer directement une trame de données à partir d'un dictionnaire (je ne l'ai pas utilisé depuis longtemps: p)
la source
Juste une nouvelle version de la réponse acceptée, comme
python3.x
ne prend pas en chargeurllib2
la source
Le problème est que vous avez plusieurs colonnes dans le bloc de données qui contiennent des dicts avec des dicts plus petits à l'intérieur. Utile Json est souvent fortement imbriqué. J'ai écrit de petites fonctions qui tirent les informations que je veux dans une nouvelle colonne. De cette façon, je l'ai dans le format que je veux utiliser.
la source
La réponse acceptée a quelques problèmes de fonctionnement, je souhaite donc partager mon code qui ne repose pas sur urllib2:
Production:
PS: l'API est pour les prix de l'électricité au Danemark
la source
Voici une petite classe utilitaire qui convertit JSON en DataFrame et inversement: j'espère que vous trouverez cela utile.
la source
La solution de billmanH m'a aidé, mais ne fonctionnait pas jusqu'à ce que je suis passé de:
à:
voici le reste, la conversion en dictionnaire est utile pour travailler avec des données json.
la source
la source
Une fois que vous avez l'aplatissement
DataFrame
obtenu par la réponse acceptée, vous pouvez faire des colonnes unMultiIndex
("en-tête multiligne fantaisie") comme ceci:la source