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_x
和 loc_y
在 grp_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']))))
- 需要修改您的测试数据。一个多边形至少有三个点
- 这归结为了解 pandas。
groupby().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
),
}
)
)
)
我有一个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_x
和 loc_y
在 grp_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']))))
- 需要修改您的测试数据。一个多边形至少有三个点
- 这归结为了解 pandas。
groupby().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
),
}
)
)
)