Pandas 使用 groupby 和 lambda 将 DataFrame 转换为具有多边形几何形状的 GeoDataFrame

Pandas DataFrame to GeoDataFrame with Polygon geometry using groupby and lambda

我有一个pandasDataFrame这样的

name    loc_x    loc_y    grp_name
a1        1.0        2.0    set1
a2        2.0        3.0    set1
a3        3.2        4.1    set2
a4        7.9        4.2    set2

我想生成一个 GeoDataFrame,它使用 loc_xloc_ygrp_name 上分组生成一个 polygon,并且还包括一个列 name 我的原始数据框中的值由 | 连接?结果应该是这样的

        name    geometry
set1    a1|a2   POLYGON ((1.0, 2.0)...)
set2    a3|a4   POLYGON ((3.2, 4.1)...)

我这样做是为了获取几何列,但是如何从我的基础数据框中获取一个附加的 name 列?

gdf = gpd.GeoDataFrame(geometry=df.groupby('grp_name').apply(
      lambda g: Polygon(gpd.points_from_xy(g['loc_x'], g['loc_y']))))
  • 需要修改您的测试数据。一个多边形至少有三个点
  • 这归结为了解 pandasgroupby().apply() 为每个组提供对数据框的引用。然后很容易为每组构造你想要的两个输出
import pandas as pd
import geopandas as gpd
import shapely.geometry
import io

df = pd.read_csv(io.StringIO("""name    loc_x    loc_y    grp_name
a1        1.0        2.0    set1
a2        2.0        3.0    set1
a2.5      3.0        4.0    set1
a3        3.2        4.1    set2
a4        7.9        4.2    set2
a4.5      8.1        4.3    set2"""),sep="\s+",)

gpd.GeoDataFrame(
    df.groupby("grp_name").apply(
        lambda d: pd.Series(
            {
                "name": "|".join(d["name"].tolist()),
                "geometry": shapely.geometry.Polygon(
                    d.loc[:, ["loc_x", "loc_y"]].values
                ),
            }
        )
    )
)