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
相关产品推荐
相关产品推荐

