Geopandas设置几何形状:MultiPolygon出现“equal len keys and value”的ValueError错误。

6

我有两个带有几何列的地理数据框,我要把其中一个里面的一些几何形状复制到另一个里面。

这对于多边形来说可以正常工作,但是对于任何(有效的)多重多边形却会返回一个ValueError。

请问如何解决? 我不知道是否/如何/为什么需要改变MultiPolygon才能获得“相等的len键和值”?

geodata01.loc[index, 'geometry'] = geodata02.loc[index, 'geometry']

这适用于多边形,但是对于复合多边形,我会得到以下结果:

ValueError 
if len(labels) != len(value):
--> 611      raise ValueError('Must have equal len keys and value '
    612      'when setting with an iterable')

我也不能对缓冲或简化的MultiPolygon进行分配(MultiPolygon有效,可以绘制、缓冲、简化,但无法分配):

geodata01.loc[index, 'geometry'] = geodata01.loc[index, 'geometry'].buffer(0)
#or
geodata01.loc[index, 'geometry'] = geodata01.loc[index, 'geometry'].simplify(tolerance=0)

这会返回相同的ValueError错误。


2
嗨Wouter,你想在https://github.com/geopandas/geopandas/issues上为此打开一个问题吗? - joris
谢谢Joris,我已经完成了:https://github.com/geopandas/geopandas/issues/992 - Wouter
1
一个 MultiPolygon 基本上是由多个 Polygon 组成的列表。当检测到 MultiPolygon 时,您是否可以将处理应用于其中每个 Polygon?基本上:list_of_polygons = list(Multipolygon) - Eskapp
1个回答

6

以下是Joris提供的github问题的解释和解决方法:

"原因是pandas会检查您要分配的值的长度,以查看它是否与您正在分配的元素数匹配(这里是单个元素,因为索引是标量)。 因此,我们可能需要在pandas一侧讨论如何处理它。

作为解决方法,您可以将其分配给一个元素的列表:

df.loc[[0], 'geometry'] = df.loc[[1], 'geometry'].values

请注意,我也使用列表来选择要分配的单个元素,但然后执行。值,因此我基本上正在分配一个值的数组(问题是当不转换为数组时,pandas将尝试根据索引对齐,而分配会出错)。
再次感谢Joris提供的解决方法并创建了一个pandas问题以解决这个问题:REGR: assigning scalar with a length no longer works

1
你好!你知道为什么我尝试这个时候会出现这个错误吗?“AttributeError:'MultiPolygon'对象没有'values'属性”。 - Elise1369
@Elise1369:您可以使用type()检查要查看.values的对象类型。我的数据框选择是在索引上使用列表[]。您的可能是直接索引,这将返回单个值(标量),在这种情况下是一个'MultiPolygon'几何对象,它没有values属性。 - Wouter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接