我正在使用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/

10-12 03:41
查看更多