To, co próbuję zrobić, to wyodrębnić dane wysokości z interfejsu API map Google wzdłuż ścieżki określonej przez współrzędne szerokości i długości geograficznej w następujący sposób:
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()
To daje mi dane, które wyglądają następująco:
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"',
'}']
podczas umieszczania w as DataFrame otrzymuję:
pd.read_json(elevations)
a oto, czego chcę:
Nie jestem pewien, czy jest to możliwe, ale przede wszystkim szukam sposobu, aby móc umieścić dane dotyczące wysokości, szerokości i długości geograficznej razem w ramce danych pandy (nie musi mieć fantazyjnych nagłówków mutiline).
Jeśli ktoś może pomóc lub udzielić porady dotyczącej pracy z tymi danymi, byłoby świetnie! Jeśli nie możesz powiedzieć, że wcześniej nie pracowałem zbyt wiele z danymi JSON ...
EDYTOWAĆ:
Ta metoda nie jest aż tak atrakcyjna, ale wydaje się działać:
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
kończy się ramką danych zawierającą kolumny szerokość, długość i wysokość
źródło
Odpowiedzi:
Znalazłem szybkie i łatwe rozwiązanie tego, co chciałem używać
json_normalize()
w programiepandas 1.01
.Daje to ładną spłaszczoną ramkę danych z danymi json, które otrzymałem z Google Maps API.
źródło
pd.DataFrame.from_records()
zgodnie z opisem stackoverflow.com/a/33020669/1137803Sprawdź to wycinek.
Mam nadzieję, że to pomoże :)
źródło
Możesz najpierw zaimportować dane json do słownika Pythona:
Następnie modyfikuj dane w locie:
Przebuduj ciąg JSON:
Wreszcie :
Możesz również prawdopodobnie uniknąć zrzucania danych z powrotem do ciągu, zakładam, że Panda może bezpośrednio utworzyć DataFrame ze słownika (nie używałem go od dłuższego czasu: p)
źródło
Tylko nowa wersja zaakceptowanej odpowiedzi, ponieważ
python3.x
nie obsługujeurllib2
źródło
Problem polega na tym, że masz kilka kolumn w ramce danych, które zawierają dykty z mniejszymi w nich dyktami. Przydatne Json jest często mocno zagnieżdżone. Pisałem małe funkcje, które wyciągają potrzebne informacje do nowej kolumny. W ten sposób mam to w formacie, którego chcę używać.
źródło
Zaakceptowana odpowiedź ma pewne problemy z funkcjonowaniem, więc chcę udostępnić mój kod, który nie opiera się na urllib2:
Wynik:
PS: API dotyczy duńskich cen energii elektrycznej
źródło
Oto mała klasa narzędziowa, która konwertuje JSON na DataFrame iz powrotem: Mam nadzieję, że okaże się to pomocne.
źródło
Rozwiązanie billmanH pomogło mi, ale nie działało, dopóki nie przełączyłem się z:
do:
oto reszta. Konwersja do słownika jest pomocna przy pracy z danymi json.
źródło
źródło
Po spłaszczeniu
DataFrame
uzyskanym przez zaakceptowaną odpowiedź możesz zmienić kolumny wMultiIndex
(„fantazyjny nagłówek wielowierszowy”) w następujący sposób:źródło