2017-05-02 3 views
0

Ich versuche, eine neue Spalte zu meinem datafram wie dies hinzuzufügen:Python/Pandas - Aktualisieren von Datenrahmen von JSON mit Bedingungen

df_precip_avail_rain_hourly['coordE'] = [ 
     item for item in data["features"] 
     if item["properties"]["cellId"] == df_precip_avail_rain_hourly.SId 
    ][0]["geometry"]["coordinates"][0][0][0] 

Ohne die Pandas Update ergibt dies eine float:

[item for item in data["features"] 
if item["properties"]["cellId"] == 38][0]["geometry"]["coordinates"][0][0][0] 
#returns 10.914622377957983 

jedoch Wenn ich damit meine DF aktualisieren möchten, ich die folgende Fehlermeldung erhalten:

ValueError        Traceback (most recent call last) 
<ipython-input-154-bbdf5e48ffd5> in <module>() 
----> 1 df_precip_avail_rain_hourly['coordE'] = [item for item in data["features"] if (item["properties"]["cellId"] == df_precip_avail_rain_hourly.SId).bool()][0]["geometry"]["coordinates"][0][0][0] 

<ipython-input-154-bbdf5e48ffd5> in <listcomp>(.0) 
----> 1 df_precip_avail_rain_hourly['coordE'] = [item for item in data["features"] if (item["properties"]["cellId"] == df_precip_avail_rain_hourly.SId).bool()][0]["geometry"]["coordinates"][0][0][0] 

/usr/local/lib/python3.5/dist-packages/pandas/core/generic.py in bool(self) 
    908        "{0}".format(self.__class__.__name__)) 
    909 
--> 910   self.__nonzero__() 
    911 
    912  def __abs__(self): 

/usr/local/lib/python3.5/dist-packages/pandas/core/generic.py in __nonzero__(self) 
    890   raise ValueError("The truth value of a {0} is ambiguous. " 
    891       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 892       .format(self.__class__.__name__)) 
    893 
    894  __bool__ = __nonzero__ 

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

ich versuchte .bool() l zu verwenden, ike:

df_precip_avail_rain_hourly['coordE'] = [ 
     item for item in data["features"] 
     if (item["properties"]["cellId"] == df_precip_avail_rain_hourly.SId).bool() 
    ][0]["geometry"]["coordinates"][0][0][0] 

Der gleiche Fehler erscheint jedoch. Was kann ich tun, um dies zu beheben? Vielen Dank!

EDIT df_precip_avail_rain_hourly hat Daten wie:

index SId 
1  38 
2  38 
3  46 

Und data ist ein JSON mit Elementen wie:

{'geometry': {'coordinates': [[[10.914622377957983, 45.682007076150505], 
    [10.927456267537572, 45.68179119797432], 
    [10.927147329501077, 45.672795442796335], 
    [10.914315493899755, 45.67301125363092], 
    [10.914622377957983, 45.682007076150505]]], 
    'type': 'Polygon'}, 
'id': 0, 
'properties': {'cellId': 38}, 
'type': 'Feature'} 

Daraus möchte ich

index SId coordE 
1  38 10.914622377957983 
2  38 10.914622377957983 
3  46 11.995422377959684 
machen

usw.

Antwort

0

Pandas nicht versteht, wie diese Zeile des Codes zur Bewertung:

if item["properties"]["cellId"] == df_precip_avail_rain_hourly.SId 

Es versucht zu vergleichen SId einen einzelnen Wert für die gesamte Serie (was aussieht wie). Die Weitergabe an if verursacht die Mehrdeutigkeit.

Ein besserer Ansatz wäre data in einen Datenrahmen zu konvertieren, dann verschmelzen die Datenrahmen:

df_coords = pd.DataFrame(
    [[item['properties']['cellId'], item['geometry']['coordinates'][0][0][0]] 
    for item in data], columns=['SId','coordE']) 

df_precip_avail_rain_hourly.merge(df_coords, how='left', on='SId') 
+0

Nun 'df_precip_avail_rain_hourly' hat eine Spalte mit dem Namen' SId'. Ich möchte den Datenrahmen so aktualisieren, dass, wenn die "SId" der aktuellen Zeile mit "item [" properties "] [" cellId "]' übereinstimmt, die Coordinate der entsprechenden Zelle der Wert in dieser Zeile ist. –

+0

ist 'Daten' ein geschachteltes Wörterbuch oder ein Datenrahmen oder etwas ganz anderes? – James

+0

Wie ich im Titel "Aktualisieren von Datenrahmen von JSON mit Bedingungen" erwähnt habe, ist es ein JSON. Ich habe die Frage zur Klärung aktualisiert. –

Verwandte Themen