2017-06-16 11 views
1

Ich habe einen Datenrahmen (df) wie folgt aus:Pandas DataFrame.apply: Erstellen Sie neue Spalte mit Daten aus zwei Spalten

PointID Time     geojson 
----  ----     ----  
36F  2016-04-01T03:52:30 {'type': 'Point', 'coordinates': [3.961389, 43.123]} 
36G  2016-04-01T03:52:50 {'type': 'Point', 'coordinates': [3.543234, 43.789]} 

Die GeoJSON Spaltendaten in GeoJSON-Format enthält (esentially, ein Python dict).

Ich möchte eine neue Spalte im GeoJSON-Format erstellen, die die Zeitkoordinate enthält. Mit anderen Worten, ich möchte die Zeitinformation in die geoJSON-Info einfügen.

Für einen einzelnen Wert, kann ich erfolgreich tun: related question

Aber jetzt ich:

oldjson = df.iloc[0]['geojson'] 
newjson = [df['coordinates'][0], df['coordinates'][1], df.iloc[0]['time'] ] 

für einen einzelnen Parameter, I dataFrame.apply in Kombination mit Lambda (dank SO erfolgreich eingesetzt habe zwei Parameter, und ich möchte es auf dem ganzen DataFrame verwenden. Da ich nicht mit der .apply-Syntax und Lambda vertraut bin, weiß ich nicht, ob das überhaupt möglich ist. Ich würde gerne so etwas machen:

def inject_time(geojson, time): 
""" 
Injects Time dimension into geoJSON coordinates. Expects a dict in geojson POINT format. 
""" 
geojson['coordinates'] = [geojson['coordinates'][0], geojson['coordinates'][1], time] 
return geojson 


df["newcolumn"] = df["geojson"].apply(lambda x: inject_time(x, df['time']))) 

... aber das funktioniert nicht, weil die Funktion die ganze Serie injizieren würde.

EDIT: dachte ich, dass das Format der timestamped GeoJSON dies etwas sein soll:

TimestampedGeoJson({ 
      "type": "FeatureCollection", 
       "features": [ 
       { 
        "type": "Feature", 
        "geometry": { 
        "type": "LineString", 
        "coordinates": [[-70,-25],[-70,35],[70,35]], 
        }, 
        "properties": { 
        "times": [1435708800000, 1435795200000, 1435881600000] 
        } 
        } 
       ] 
       }) 

das Zeitelement im Eigenschaftenelement ist also, aber das Problem nicht viel ändern.

+0

Können Sie Ihre Datenrahmen aktualisieren Koordinaten hinzufügen? – Tbaki

+0

@ Ulu83 - Hmmm, was ist die gewünschte Ausgabe von Ihren Eingabedaten? – jezrael

Antwort

2

Sie müssen DataFrame.apply mit axis=1 für die Verarbeitung von Zeilen:

df['new'] = df.apply(lambda x: inject_time(x['geojson'], x['Time']), axis=1) 

#temporary display long string in column 
with pd.option_context('display.max_colwidth', 100): 
    print (df['new']) 

0 {'type': 'Point', 'coordinates': [3.961389, 43.123, '2016-04-01T03:52:30']} 
1 {'type': 'Point', 'coordinates': [3.543234, 43.789, '2016-04-01T03:52:50']} 
Name: new, dtype: object 
Verwandte Themen