如何将单列Geometry的GeoDataFrame合并到多列GeoDataFrame
解决GeoPandas合并DataFrame并保留Geometry类型的问题
核心解决方案
由于两个数据集行数相同且索引对齐,直接横向合并后转换为GeoDataFrame即可,以下是两种可靠实现方法:
方法一:直接赋值列并转换
先将df2的geometry列添加到df1,再把结果转为GeoDataFrame:
import geopandas as gpd # 将df2的geometry列添加到df1 df1['geometry'] = df2['geometry'] # 转换为GeoDataFrame,指定geometry列 df3 = gpd.GeoDataFrame(df1, geometry='geometry')
方法二:使用concat横向合并
通过pd.concat横向合并两个数据集,再转为GeoDataFrame:
import pandas as pd import geopandas as gpd # 按列横向合并(axis=1表示列方向) merged_df = pd.concat([df1, df2], axis=1) # 转换为GeoDataFrame df3 = gpd.GeoDataFrame(merged_df, geometry='geometry')
为什么之前的方法失败?
append:该方法是纵向追加行,而非横向添加列,完全不符合需求insert:仅用insert添加列后,若未转为GeoDataFrame,geometry列只是普通shapely对象,无法保留GeoDataFrame的空间特性concat:未指定axis=1时默认纵向合并行,即使指定了axis=1,若不转为GeoDataFrame,也会丢失GeoDataFrame的类型特性
验证示例
用你提供的样例数据验证:
import pandas as pd import geopandas as gpd from shapely.geometry import Polygon # 构造df1 data1 = { 'Mean': [174.7, 190.4], 'Std Dev': [417.9, 402.8], 'Max': [6904, 6876], 'Min': [0, 0], 'Day': [2019003, 2019004], 'Date': ['2019-01-03', '2019-01-04'] } df1 = pd.DataFrame(data1) # 构造df2 data2 = { 'geometry': [ Polygon([(-78, 43), (-78, 44), (-77, 44), (-77, 43)]), Polygon([(-78, 43), (-78, 44), (-77, 44), (-77, 43)]) ] } df2 = gpd.GeoDataFrame(data2) # 使用方法一合并 df1['geometry'] = df2['geometry'] df3 = gpd.GeoDataFrame(df1, geometry='geometry') # 验证geometry类型 print(type(df3['geometry'].iloc[0])) # 输出 <class 'shapely.geometry.polygon.Polygon'> print(df3.head())
注意事项
- 确保两个数据集的索引完全对齐,若索引不一致,先重置索引:
df1 = df1.reset_index(drop=True) df2 = df2.reset_index(drop=True) - 合并后必须用
gpd.GeoDataFrame包装,才能保留GeoDataFrame的空间操作能力
内容的提问来源于stack exchange,提问作者MedicineMan
相关产品推荐
相关产品推荐

