如何基于另一df的经纬度范围条件删除主df的对应行?
报错原因
你代码中出现该报错的核心原因是:if (x > incidents_locations['Latitude'])语句里,incidents_locations['Latitude']是完整的Series列数据,和单个值x比较后返回的是布尔值组成的Series,而Python的if判断需要接收单个布尔值,无法直接处理Series类型的判断结果,因此抛出真值模糊的错误。
同时你原有的遍历df_limit逐行判断删除的逻辑效率极低,且会出现重复删除、结果不符合预期的问题。
解决方案
你的需求是保留主df中经纬度落在df_limit的经纬度范围内的行,直接通过pandas向量化操作即可完成,无需循环:
- 首先提取
df_limit中的经纬度合法边界
# 计算纬度的上下限 lat_min, lat_max = df_limit['Latitude'].min(), df_limit['Latitude'].max() # 计算经度的上下限 lon_min, lon_max = df_limit['Longitude'].min(), df_limit['Longitude'].max()
- 直接通过布尔索引过滤主df
# 同时校验经纬度,保留均在合法范围内的行 df_filtered = incidents_locations[ (incidents_locations['Latitude'].between(lat_min, lat_max)) & (incidents_locations['Longitude'].between(lon_min, lon_max)) ]
如果你需要分开处理纬度和经度的过滤,也可以分两步写:
# 第一步过滤合法纬度 temp_df = incidents_locations[incidents_locations['Latitude'].between(lat_min, lat_max)] # 第二步过滤合法经度,得到最终结果 df_filtered = temp_df[temp_df['Longitude'].between(lon_min, lon_max)]
特殊场景说明:如果你要求主df的经纬度必须完全匹配
df_limit中存在的某一个经纬度点,而非落在区间范围内,可以改用isin方法实现:df_filtered = incidents_locations[ (incidents_locations['Latitude'].isin(df_limit['Latitude'])) & (incidents_locations['Longitude'].isin(df_limit['Longitude'])) ]
内容的提问来源于stack exchange,提问作者Okenite
相关产品推荐
相关产品推荐

