2015-06-07 186 views
2

我正在使用GeoPandas和Pandas。 我有一個300,000行的Dataframe,df,有4列+索引列。熊貓和GeoPandas索引和切片

 id  lat   lon  geometry 
    0 2009 40.711174 -73.99682 0 
    1 536 40.741444 -73.97536 0 
    2 228 40.754601 -73.97187 0 

但是唯一ID是隻有極少數(〜200)

我想生成每個(緯度,經度)組合shapely.geometry.point.Point對象,類似於下面顯示的那樣:http://nbviewer.ipython.org/gist/kjordahl/7129098 (請參閱cell#5), 它循環遍歷數據幀的所有行;但對於這樣一個大數據集,我想將循環限制到少得多的唯一ID。

因此,對於價值給定的ID,idvalue(即2009年從第一行)創建GeoSeries,並直接將其指定爲具有ID == idvalue

我的代碼看起來所有的行狀:

for count, iunique in enumerate(df.if.unique()): 
     sc_start = GeoSeries([Point(np.array(df[df.if==iunique].lon)[0],np.array(df[df.if==iunique].lat)[0])]) 
     df.loc[iunique,['geometry']] = sc_start 

然而事情不起作用 - 幾何字段沒有改變 - 我認爲是因爲sc_start的索引與df的索引不匹配。

我該如何解決這個問題?我應該堅持整個DF的循環?

回答

3

我將採取以下措施:

  1. 首先找到的唯一的ID,並創建點的GeoSeries此:

    unique_ids = df.groupby('id', as_index=False).first() 
    unique_ids['geometry'] = GeoSeries([Point(x, y) for x, y in zip(unique_ids['lon'], unique_ids['lat'])]) 
    
  2. 然後與匹配原始數據幀合併這些幾何ids:

    df.merge(unique_ids[['id', 'geometry']], how='left', on='id') 
    
+0

這似乎更優雅,我做了什麼。你可以 – claire

+0

這似乎更加優雅,我做了什麼! 在我原來的問題中,我簡化了df數據框。實際上它有10列,但我只需要將三個複製到unique_ids(id,lon,lat)。我可以通過groupby選擇只有三個字段從DF到unique_ids嗎? (抱歉的雙重評論) – claire

+0

你可以做,例如'df [['id','lon','lat']]。groupby('id'...' – joris