DataFrame含MultiPolygon时print触发Shapely弃用警告的非抑制解决方法
问题描述与操作步骤
操作步骤及现象
- 创建1列1行的DataFrame:
输入:
data = [[[12.9883, 52.7281], [12.9883, 52.2658], [13.8967, 52.2658], [13.8967, 52.7281], [12.9883, 52.7281]]] df = pd.DataFrame({'new_coords': [data]})
输出:None
- 打印DataFrame:
输入:print(df)
输出:
new_coords 0 [[[12.9883, 52.7281], [12.9883, 52.2658], [13....
- 添加新列,从坐标列表生成MultiPolygon:
输入:
df['new_shape'] = df['new_coords'].apply(lambda x: MultiPolygon([Polygon(i) for i in x]))
输出:None
打印DataFrame:
输入:print(df)
输出DataFrame内容的同时,触发多条Shapely弃用警告,提示多部分几何的迭代和__len__方法将在Shapely 2.0中移除,建议使用geoms属性访问组成部分。在DataFrame外执行相同操作:
输入:
i = 0 new_coords = df['new_coords'][i] x = new_coords new_shape = MultiPolygon([Polygon(i) for i in x]) print(new_shape)
输出:
MULTIPOLYGON (((12.9883 52.7281, 12.9883 52.2658, 13.8967 52.2658, 13.8967 52.7281, 12.9883 52.7281)))
无警告触发。
环境版本:pandas 2.1.1,Shapely 1.8.4
问题:除了直接抑制警告外,有没有其他方法可以避免触发这些弃用警告?
解决方案
警告触发的核心原因是:pandas打印DataFrame时,会对MultiPolygon对象执行内部迭代操作(比如计算显示长度、遍历元素来截断输出),而Shapely 1.8.4中这类迭代方式已被标记为弃用;直接打印单个MultiPolygon对象时则不会触发这类内部逻辑。
以下是几种有效避免警告的方法:
方法1:自定义几何对象的格式化逻辑
让pandas打印MultiPolygon时直接调用其WKT格式输出,跳过迭代操作:
from shapely.geometry import MultiPolygon, Polygon import pandas as pd # 自定义格式化函数,返回几何对象的WKT字符串 def format_geometry(geom): return geom.wkt # 构造DataFrame并生成几何列 data = [[[12.9883, 52.7281], [12.9883, 52.2658], [13.8967, 52.2658], [13.8967, 52.7281], [12.9883, 52.7281]]] df = pd.DataFrame({'new_coords': [data]}) df['new_shape'] = df['new_coords'].apply(lambda x: MultiPolygon([Polygon(i) for i in x])) # 打印时对几何列应用自定义格式化,同时关闭列宽截断 pd.options.display.max_colwidth = None print(df.assign(new_shape=df['new_shape'].apply(format_geometry)))
方法2:使用GeoPandas处理地理空间数据
GeoPandas是专门为地理空间数据设计的库,对Shapely对象的处理更适配,不会触发这类弃用警告:
import geopandas as gpd from shapely.geometry import MultiPolygon, Polygon data = [[[12.9883, 52.7281], [12.9883, 52.2658], [13.8967, 52.2658], [13.8967, 52.7281], [12.9883, 52.7281]]] # 使用GeoDataFrame替代原生DataFrame gdf = gpd.GeoDataFrame({'new_coords': [data]}) gdf['new_shape'] = gdf['new_coords'].apply(lambda x: MultiPolygon([Polygon(i) for i in x])) print(gdf)
方法3:升级Shapely到2.x版本
Shapely 2.0已经重构了几何对象的迭代逻辑,弃用警告对应的旧逻辑已被移除,升级后自然不会再触发相关警告:
pip install --upgrade shapely>=2.0
内容的提问来源于stack exchange,提问作者Karol Kuhl
相关产品推荐
相关产品推荐

