基于坐标合并两个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
相关产品推荐
相关产品推荐

