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

Python中基于坐标条件筛选DataFrame得到空表的解决办法

问题描述

我有一个记录纽约车祸数据的DataFrame,包含['LATITUDE', 'LONGITUDE']两列。在Jupyter Notebook中用这些数据生成了车祸热力图,想提取热力图中三个红圈区域的数据,创建三个新的DataFrame。已获取三个红圈的圆心坐标:

[40.760697660115106, -73.9648705595026]
[40.75656269439069, -73.99424647774494]
[40.696088299716685, -73.9846228443624]

为获取范围数据而非单一条目,我用了以下代码:

# 创建每个DataFrame的筛选条件
cond2 = df['LATITUDE'].between(40.76, 40.77) & df['LONGITUDE'].between(-73.96, -73.97487055)
cond3 = df['LATITUDE'].between(40.75, 40.76) & df['LONGITUDE'].between(-73.99, -74)
cond1 = df['LATITUDE'].between(40.69, 40.70) & df['LONGITUDE'].between(-73.98, -73.99462284)

# 用loc和条件筛选原DataFrame
df1 = df.loc[cond1]
df2 = df.loc[cond2]
df3 = df.loc[cond3]

# 展示结果
display(df1)
display(df2)
display(df3)

但结果得到三个空的DataFrame,该怎么解决?

解决方案

问题根源

你使用between()时参数顺序错误。between(a, b)要求第一个参数a必须小于等于第二个参数b,但你的经度范围里,比如cond2中的-73.96比-73.97487055大(负数比较规则:绝对值小的负数更大),导致between无法匹配任何数据,直接返回空结果。

修复方案

方案一:修正between参数顺序

把每个范围的较小值放在between的第一个参数位置,较大值放在第二个位置,确保a <= b:

# 修正条件的参数顺序
cond2 = df['LATITUDE'].between(40.76, 40.77) & df['LONGITUDE'].between(-73.97487055, -73.96)
cond3 = df['LATITUDE'].between(40.75, 40.76) & df['LONGITUDE'].between(-74, -73.99)
cond1 = df['LATITUDE'].between(40.69, 40.70) & df['LONGITUDE'].between(-73.99462284, -73.98)

# 筛选并展示结果
df1 = df.loc[cond1]
df2 = df.loc[cond2]
df3 = df.loc[cond3]

display(df1, df2, df3)

方案二:按圆形区域筛选(更精准)

因为目标是提取红圈区域的数据,用矩形范围(between)会包含圈外的矩形区域,不如直接计算每个点到圆心的距离,筛选距离小于半径的点更贴合需求:

import numpy as np

# 定义三个圆心坐标,以及红圈对应的半径(可根据实际调整,0.005约对应500米)
centers = [
    (40.760697660115106, -73.9648705595026),
    (40.75656269439069, -73.99424647774494),
    (40.696088299716685, -73.9846228443624)
]
radius = 0.005

# 批量筛选每个圆形区域的数据
dfs = []
for lat_center, lon_center in centers:
    # 计算每个点到当前圆心的欧氏距离
    distances = np.sqrt(
        (df['LATITUDE'] - lat_center)**2 + 
        (df['LONGITUDE'] - lon_center)**2
    )
    # 筛选距离小于半径的点
    filtered_df = df[distances < radius]
    dfs.append(filtered_df)

# 拆分得到三个目标DataFrame
df1, df2, df3 = dfs

display(df1, df2, df3)

额外验证步骤

如果修正后仍得到空DataFrame,可执行以下步骤排查:

  • 查看原DataFrame的经纬度范围,确认筛选范围是否在数据覆盖区间内:
print("纬度范围:", df['LATITUDE'].min(), "-", df['LATITUDE'].max())
print("经度范围:", df['LONGITUDE'].min(), "-", df['LONGITUDE'].max())
  • 检查圆心坐标是否与热力图红圈位置匹配,或适当扩大筛选范围/半径。

内容的提问来源于stack exchange,提问作者Ricardo Roel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:35:26