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

DataFrame含MultiPolygon时print触发Shapely弃用警告的非抑制解决方法

问题描述与操作步骤

操作步骤及现象

  1. 创建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

  1. 打印DataFrame:
    输入:print(df)
    输出:
new_coords
0  [[[12.9883, 52.7281], [12.9883, 52.2658], [13....
  1. 添加新列,从坐标列表生成MultiPolygon:
    输入:
df['new_shape'] = df['new_coords'].apply(lambda x: MultiPolygon([Polygon(i) for i in x]))

输出:None

  1. 打印DataFrame:
    输入:print(df)
    输出DataFrame内容的同时,触发多条Shapely弃用警告,提示多部分几何的迭代和__len__方法将在Shapely 2.0中移除,建议使用geoms属性访问组成部分。

  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:37:07