2015-06-07 2 views
2

Я использую GeoPandas и Pandas. У меня есть, скажем, 300 000 строк Dataframe, df, с 4 столбцами + индексный столбец.Индексирование и нарезка Pandas и 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 

однако уникальные идентификаторы лишь несколько (~ 200)

Я хочу, чтобы создать объект shapely.geometry.point.Point для каждого (широта, долгота) комбинации, подобно тому, как показано здесь : http://nbviewer.ipython.org/gist/kjordahl/7129098 (см. Ячейку # 5), , где он проходит через все строки данных; но для такого большого набора данных я хотел бы ограничить цикл гораздо меньшим количеством уникальных идентификаторов.

Таким образом, для заданного значения идентификатора, idvalue (т.е. 2009 из первого ряда) создать GeoSeries, и назначить его непосредственно ко всем строкам, которые имеют идентификатор == 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. Сначала найти уникальный идентификатор и создать 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. Затем объединить эти геометрические формы с оригинальным dataframe о соответствии идентификаторы:

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

Это кажется более элегантным, чем то, что я сделал. Могли бы вы – claire

+0

Это кажется более элегантным, чем то, что я сделал! В моем первоначальном вопросе я упростил df dataframe. На самом деле он имеет 10 столбцов, но мне нужно скопировать только три в unique_ids (id, lon, lat). могу ли я выбрать только три поля из df в unique_ids через groupby? (извините за двойной комментарий) – claire

+0

вы можете сделать, например, 'df [['id', 'lon', 'lat']]. groupby ('id' ...' – joris

Смежные вопросы