it-swarm.com.de

JSON auf Pandas DataFrame

Was ich versuche, ist, Höhendaten aus einem Google Maps-API entlang eines Pfads zu extrahieren, der durch Längen- und Längenkoordinaten angegeben wird, wie folgt:

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"',
 '}']

beim Einfügen als DataFrame bekomme ich Folgendes:

enter image description here

pd.read_json(elevations)

und hier ist was ich will:

enter image description here

Ich bin nicht sicher, ob dies möglich ist, aber vor allem, was ich suche, ist eine Möglichkeit, die Höhen-, Breiten- und Längenangaben in einem Pandas-Datenrahmen zusammenstellen zu können (muss keine ausgefallenen Mutiline-Header haben).

Wenn jemand helfen kann oder Ratschläge für die Arbeit mit diesen Daten gibt, wäre das großartig! Wenn Sie nicht wissen, dass ich noch nicht viel mit Json-Daten gearbeitet habe ...

BEARBEITEN:

Diese Methode ist nicht besonders attraktiv, scheint jedoch 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 den Datenrahmen mit den Spalten Breitengrad, Längengrad und Höhe

enter image description here

82
pbreach

Ich fand eine schnelle und einfache Lösung für das, was ich mit der json_normalize-Funktion in der neuesten Version von Pandas 0.13 wollte. 

from urllib2 import Request, urlopen
import json
from pandas.io.json import json_normalize

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)
json_normalize(data['results'])

Dies ergibt ein Nice-abgeflachtes Dataframe mit den Json-Daten, die ich von der Google Maps-API erhalten habe.

106
pbreach

Überprüfen Sie diesen Ausschnitt. 

# reading the JSON data using json.load()
file = 'data.json'
with open(file) as train_file:
    dict_train = json.load(train_file)

# converting json dataset from dictionary to dataframe
train = pd.DataFrame.from_dict(dict_train, orient='index')
train.reset_index(level=0, inplace=True)

Ich hoffe es hilft :)

14
Rishu

Sie können Ihre Json-Daten zunächst in einem Python-Wörterbuch importieren:

data = json.loads(elevations)

Ändern Sie dann die Daten im laufenden Betrieb:

for result in data['results']:
    result[u'lat']=result[u'location'][u'lat']
    result[u'lng']=result[u'location'][u'lng']
    del result[u'location']

Json-String neu erstellen:

elevations = json.dumps(data)

Endlich :

pd.read_json(elevations)

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 es seit langer Zeit nicht mehr verwendet: p)

10
Raphaël Braud

Das Problem ist, dass sich im Datenrahmen mehrere Spalten befinden, die Diagramme enthalten, in denen kleinere Diagramme enthalten sind. 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. 

for row in range(len(data)):
    #First I load the dict (one at a time)
    n = data.loc[row,'dict_column']
    #Now I make a new column that pulls out the data that I want.
    data.loc[row,'new_column'] = n.get('key')
4
billmanH

die Lösung von billmanH hat mir geholfen, funktionierte jedoch erst, nachdem ich gewechselt hatte:

n = data.loc[row,'json_column']

zu:

n = data.iloc[[row]]['json_column']

hier ist der Rest, die Konvertierung in ein Wörterbuch ist hilfreich für die Arbeit mit Json-Daten.

import json

for row in range(len(data)):
    n = data.iloc[[row]]['json_column'].item()
    jsonDict = json.loads(n)
    if ('mykey' in jsonDict):
        display(jsonDict['mykey'])
1
niltoid

Hier ist eine kleine Utility-Klasse, die JSON in DataFrame und zurück konvertiert: Ich hoffe, Sie finden dies hilfreich.

# -*- coding: utf-8 -*-
from pandas.io.json import json_normalize

class DFConverter:

    #Converts the input JSON to a DataFrame
    def convertToDF(self,dfJSON):
        return(json_normalize(dfJSON))

    #Converts the input DataFrame to JSON 
    def convertToJSON(self, df):
        resultJSON = df.to_json(orient='records')
        return(resultJSON)
1
Siva

Nur eine neue Version der akzeptierten Antwort, da python3.xurllib2 nicht unterstützt.

from requests import request
import json
from pandas.io.json import json_normalize

path1 = '42.974049,-81.205203|42.974298,-81.195755'
response=request(url='http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false', method='get')
elevations = response.json()
elevations
data = json.loads(elevations)
json_normalize(data['results'])
1
AB Abhi

Sobald Sie das abgeflachte DataFrame erhalten haben, können Sie die Spalten zu einem MultiIndex ("Fancy Multiline Header") machen:

df.columns = pd.MultiIndex.from_tuples([Tuple(c.split('.')) for c in df.columns])
0
loganbvh
#Use the small trick to make the data json interpret-able
#Since your data is not directly interpreted by json.loads()

>>> import json
>>> f=open("sampledata.txt","r+")
>>> data = f.read()
>>> for x in data.split("\n"):
...     strlist = "["+x+"]"
...     datalist=json.loads(strlist)
...     for y in datalist:
...             print(type(y))
...             print(y)
...
...
<type 'dict'>
{u'0': [[10.8, 36.0], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'1': [[10.8, 36.1], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'2': [[10.8, 36.2], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'3': [[10.8, 36.300000000000004], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'4': [[10.8, 36.4], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'5': [[10.8, 36.5], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'6': [[10.8, 36.6], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'7': [[10.8, 36.7], {u'10': 0, u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'8': [[10.8, 36.800000000000004], {u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}
<type 'dict'>
{u'9': [[10.8, 36.9], {u'1': 0, u'0': 0, u'3': 0, u'2': 0, u'5': 0, u'4': 0, u'7': 0, u'6': 0, u'9': 0, u'8': 0}]}


0
MIKHIL NAGARALE