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

如何筛选DataFrame:删除X、Y坐标位于多边形外的行

筛选DataFrame中位于闭合多边形内的点

嘿,你已经迈出了关键的第一步——用Shapely定义好多边形,接下来的筛选操作其实超清晰!针对你数千行数据的场景,我给你两种实用方案,兼顾效率和易用性:

方案一:纯Pandas + Shapely(高效向量化)

这种方法不用额外依赖GeoPandas,用Shapely的向量化判断工具,速度比逐行遍历快得多,非常适合处理数千行数据:

  1. 准备坐标数组
    先把DataFrame里的X、Y坐标提取成numpy数组,Z坐标不影响二维多边形的判断,可以暂时忽略:

    import pandas as pd
    import numpy as np
    from shapely.geometry import Polygon
    from shapely.vectorized import contains
    
    # 假设你已经加载了DataFrame和定义好多边形
    df = pd.read_table("你的数据文件.txt")  # 加载txt文件
    polygon_points = np.array([[x1,y1], [x2,y2], ...])  # 你的多边形顶点数组
    polygon = Polygon(polygon_points)
    
    # 提取X、Y坐标为numpy数组
    point_coords = df[["X", "Y"]].to_numpy()
    
  2. 批量判断点是否在多边形内
    用shapely.vectorized.contains做批量判断,直接生成布尔数组:

    # 第一个参数是多边形,后面两个是所有点的X、Y坐标数组
    is_inside = contains(polygon, point_coords[:, 0], point_coords[:, 1])
    
  3. 筛选DataFrame
    用布尔数组过滤,保留在多边形内的行:

    filtered_df = df[is_inside]
    

方案二:GeoPandas(更简洁的地理数据操作)

如果你的工作经常涉及地理数据,GeoPandas会让操作更直观,代码也更简洁:

  1. 转换为GeoDataFrame
    把普通DataFrame转换成带地理几何列的GeoDataFrame:

    import geopandas as gpd
    from shapely.geometry import Polygon, Point
    
    # 转换为GeoDataFrame,用X、Y生成Point对象作为几何列
    gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.X, df.Y))
    
    # 定义多边形的GeoSeries
    polygon_gs = gpd.GeoSeries([polygon])
    
  2. 筛选多边形内的点
    直接用GeoDataFrame的within方法,或者空间连接sjoin:

    # 方法1:直接用within判断
    filtered_gdf = gdf[gdf.within(polygon_gs.iloc[0])]
    
    # 方法2:空间连接(适合多个多边形的场景)
    filtered_gdf = gpd.sjoin(gdf, polygon_gs.to_frame(name="geometry"), predicate="within")
    

注意事项

  • Shapely的Polygon会自动闭合多边形,所以即使你的顶点数组最后一个点和第一个点不重合,也能正确生成闭合图形。
  • 如果多边形包含孔洞,只需要在定义Polygon时传入外环和内环的列表(比如Polygon(shell=外环数组, holes=[内环1数组, 内环2数组])),判断逻辑依然有效。
  • 对于数千行数据,方案一的向量化方法和方案二的GeoPandas操作都远快于逐行apply生成Point再判断的方式,优先推荐。

内容的提问来源于stack exchange,提问作者Red Sparrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:20:27