Ich versuche, Höhendaten aus einer Google Maps-API entlang eines Pfads zu extrahieren, der durch Breiten- und Längengradkoordinaten wie folgt angegeben wird:
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()
Dies gibt mir Daten, die so aussehen:
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"',
'}']
Wenn ich als DataFrame einsetze, bekomme ich Folgendes:
pd.read_json(elevations)
und hier ist was ich will:
Ich bin mir nicht sicher, ob dies möglich ist, aber ich suche hauptsächlich nach einer Möglichkeit, die Höhen-, Breiten- und Längengrade in einem Pandas-Datenrahmen zusammenzufassen (muss keine ausgefallenen mutilinen Header haben).
Wenn jemand helfen oder Ratschläge zum Umgang mit diesen Daten geben kann, wäre das großartig! Wenn Sie nicht sagen können, dass ich vorher nicht viel mit JSON-Daten gearbeitet habe ...
BEARBEITEN:
Diese Methode ist nicht besonders attraktiv, scheint aber zu funktionieren:
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
endet Datenrahmen mit Spalten Breite, Länge, Höhe
quelle
Antworten:
Ich fand eine schnelle und einfache Lösung zu dem, was ich wollte Verwendung
json_normalize()
in inbegriffenpandas 1.01
.Dies ergibt einen schönen abgeflachten Datenrahmen mit den JSON-Daten, die ich von der Google Maps-API erhalten habe.
quelle
pd.DataFrame.from_records()
wie hier beschrieben stackoverflow.com/a/33020669/1137803Überprüfen Sie diesen Ausschnitt.
Ich hoffe es hilft :)
quelle
Sie können Ihre JSON-Daten zunächst in ein Python-Wörterbuch importieren:
Ändern Sie dann die Daten im laufenden Betrieb:
Json-String neu erstellen:
Endlich :
Sie können wahrscheinlich auch vermeiden, Daten in einen String zurückzugeben. Ich gehe davon aus, dass Panda einen DataFrame direkt aus einem Wörterbuch erstellen kann (ich habe ihn seit langer Zeit nicht mehr verwendet: p).
quelle
Nur eine neue Version der akzeptierten Antwort, da
python3.x
nicht unterstützturllib2
quelle
Das Problem ist, dass der Datenrahmen mehrere Spalten enthält, die Diktate mit kleineren Diktaten enthalten. Nützlicher Json ist oft stark verschachtelt. Ich habe kleine Funktionen geschrieben, die die gewünschten Informationen in eine neue Spalte ziehen. Auf diese Weise habe ich es in dem Format, das ich verwenden möchte.
quelle
Die akzeptierte Antwort weist einige Funktionsprobleme auf. Daher möchte ich meinen Code freigeben, der nicht auf urllib2 basiert:
Ausgabe:
PS: API ist für dänische Strompreise
quelle
Hier ist eine kleine Dienstprogrammklasse, die JSON in DataFrame und zurück konvertiert: Ich hoffe, Sie finden dies hilfreich.
quelle
Die Lösung von billmanH hat mir geholfen, hat aber erst funktioniert, als ich von:
zu:
Hier ist der Rest: Die Konvertierung in ein Wörterbuch ist hilfreich für die Arbeit mit JSON-Daten.
quelle
quelle
Sobald Sie die
DataFrame
durch die akzeptierte Antwort erhaltene Abflachung erhalten haben, können Sie die SpaltenMultiIndex
wie folgt zu einem ("ausgefallenen mehrzeiligen Header") machen:quelle
Eine mögliche Alternative zu pandas.json_normalize besteht darin, einen eigenen Datenrahmen zu erstellen, indem nur die ausgewählten Schlüssel und Werte aus dem verschachtelten Wörterbuch extrahiert werden. Der Hauptgrund dafür ist, dass json_normalize für sehr große json-Dateien langsam wird (und möglicherweise nicht immer die gewünschte Ausgabe erzeugt).
Hier ist eine alternative Möglichkeit, das verschachtelte Wörterbuch in Pandas mit glom zu reduzieren. Ziel ist es, ausgewählte Schlüssel und Werte aus dem verschachtelten Wörterbuch zu extrahieren und in einer separaten Spalte des Pandas-Datenrahmens zu speichern (:
Hier ist eine Schritt-für-Schritt-Anleitung: https://medium.com/@enrico.alemani/flatten-nested-dictionaries-in-pandas-using-glom-7948345c88f5
quelle