Pandas读取CSV坐标生成Shapely Polygon报错求助
问题分析与解决
你的操作确实有误,直接将DataFrame切片传入Polygon无法正常工作,核心问题有两个:
df['coordinates'].iloc[:1]返回的是Series对象(哪怕只取一行),并非Shapely能识别的坐标列表格式- 坐标是以字符串形式存储的,必须先解析为数值型的坐标元组集合
正确实现步骤
1. 提取单个坐标字符串
先取出目标行的坐标字符串(注意你代码里列名拼写错误coodinates要修正为coordinates):
coord_str = df['coordinates'].iloc[0] # 用iloc[0]取单个字符串,而非iloc[:1]
2. 解析字符串为坐标元组列表
对字符串做清洗和分割,转换成Shapely兼容的格式:
# 去掉字符串首尾的引号(如果存在),再分割成单个坐标对 coords_list = coord_str.strip('"').split('),(') # 逐个处理坐标对,转换为(float, float)元组 clean_coords = [] for coord in coords_list: lon, lat = coord.strip('()').split(',') clean_coords.append((float(lon), float(lat)))
3. 创建Polygon对象
用清洗后的坐标列表即可正常创建Polygon:
from shapely.geometry import Polygon poly = Polygon(clean_coords)
完整代码示例
import pandas as pd from shapely.geometry import Polygon df = pd.read_csv('thecsv.csv') # 提取并解析坐标字符串 coord_str = df['coordinates'].iloc[0].strip('"') coords = [tuple(map(float, c.strip('()').split(','))) for c in coord_str.split('),(')] # 创建Polygon对象 poly = Polygon(coords)
批量处理所有行的方法
如果要给整个DataFrame新增Polygon列,可以用apply批量处理:
def str_to_polygon(coord_str): coord_str = coord_str.strip('"') coords = [tuple(map(float, c.strip('()').split(','))) for c in coord_str.split('),(')] return Polygon(coords) df['polygon'] = df['coordinates'].apply(str_to_polygon)
内容的提问来源于stack exchange,提问作者LearningToCodeGuy
相关产品推荐
相关产品推荐

