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

基于坐标合并两个GeoDataFrame遇报错:TypeError: unhashable type: 'Point'

解决GeoPandas基于坐标合并时的TypeError问题

你遇到的TypeError: unhashable type: 'Point',是因为merge方法要求用于连接的列必须是可哈希类型(比如字符串、数值、元组),而GeoPandas的Point几何对象属于不可哈希的可变类型,无法直接作为merge的连接键。

以下是两种可行的解决方法:

方法一:使用GeoPandas空间连接(推荐)

GeoPandas提供了专门的空间连接函数gpd.sjoin(),用于基于空间关系合并GeoDataFrame,不需要依赖哈希类型的连接键。

如果你的需求是完全匹配点坐标(两个GeoDataFrame的Point完全重合),可以指定predicate='equals':

import geopandas as gpd

# 基于几何形状完全匹配合并,how参数可选inner/left/right
df3 = gpd.sjoin(df1, df2, how='inner', predicate='equals')

如果是其他空间关系(比如点在多边形内),可以替换predicate为within/contains等对应参数。

方法二:将几何对象转为可哈希类型后用merge

如果一定要用普通merge,可以把Point的坐标提取为可哈希的元组或字符串,作为连接键:

# 给两个GeoDataFrame添加坐标列(元组类型,可哈希)
df1['coords'] = df1.geometry.apply(lambda geom: (geom.x, geom.y))
df2['coords'] = df2.geometry.apply(lambda geom: (geom.x, geom.y))

# 基于coords列合并
df3 = df1.merge(df2, on='coords')

# 可选:清理重复列,比如重命名或删除多余的geometry列
df3 = df3.drop(columns=['coords'])
df3 = df3.rename(columns={'geometry_x': 'geometry'})

内容的提问来源于stack exchange,提问作者Jojo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:39:17