【问题标题】:Geopandas set geometry: ValueError for MultiPolygon "equal len keys and value"Geopandas 设置几何:MultiPolygon“equal len 键和值”的 ValueError
【发布时间】:2019-09-24 20:53:06
【问题描述】:

我有 2 个带有几何列的地理数据框,我将一些几何从 1 复制到另一个。

这适用于多边形,但会为任何(有效的)多多边形返回 ValueError。

请指教如何解决这个问题?我不知道是否/如何/为什么我应该更改 MultiPolygon 以获得“相等的 len 键和值”?

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

这适用于多边形。只有使用 MultiPolygons 我才能得到:

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。

【问题讨论】:

标签: python pandas geopandas shapely


【解决方案1】:

Joris 提供的github issue 的解释和解决方法:

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

作为一种变通方法,您可以分配给一个元素的列表:

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

注意,我也是用一个列表来选择我要分配的单个元素,然后做.values,所以我基本上是分配一个值的数组(问题是当不转换为数组时,pandas会尝试对齐索引,分配出错)。 "

再次感谢 Joris,他提供了解决方法并创建了一个 pandas 问题来解决此问题:REGR: assigning scalar with a length no longer works

【讨论】:

  • 您好!你知道为什么当我尝试这个时,我得到这个错误吗? "AttributeError: 'MultiPolygon' 对象没有属性 'values'"
  • @Elise1369:您可以检查要查看 .values 的对象的类型(使用 type() )。我的数据框选择在索引上使用列表 []。您的可能是一个直接索引,在这种情况下将返回单个值(标量),这是一个没有 values 属性的“MultiPolygon”几何对象。
猜你喜欢
  • 2019-11-24
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2020-11-29
  • 2018-06-08
相关资源
最近更新 更多