You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:37:46