【问题标题】:Pandas and GeoPandas indexing and slicingPandas 和 GeoPandas 索引和切片
【发布时间】:2015-08-21 17:37:09
【问题描述】:

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

我想为每个 (lat,lon) 组合生成一个 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 中坚持循环吗?

【问题讨论】:

    标签: python pandas geopandas


    【解决方案1】:

    我会采取以下方法:

    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. 然后将这些几何图形与匹配 id 的原始数据框合并:

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

    【讨论】:

    • 这似乎比我所做的更优雅!在我最初的问题中,我简化了 df 数据框。实际上它有 10 列,但我只需要将其中的 3 列复制到 unique_ids(id、lon、lat)中。我可以通过groupby从df中只选择三个字段到unique_ids吗? (对不起,双重评论)
    • 你可以做例如df[['id', 'lon', 'lat']].groupby('id' ...
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2014-12-24
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多