我正在使用GeoPandas和Pandas。
我有一个300,000行Dataframe df,其中包含4列+索引列。
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
(请参阅单元格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循环吗?
最佳答案
我将采用以下方法:
首先找到唯一的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'])])
然后将这些几何形状与匹配ID上的原始数据框合并:
df.merge(unique_ids[['id', 'geometry']], how='left', on='id')
关于python - Pandas 和GeoPandas索引和切片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30689063/