如何基于指定经纬度列表删除DataFrame中匹配的多行
需要删除DataFrame中所有经纬度与上述列表值匹配的行,该怎么做? # 解决方案 ### 方法1:元组集合匹配法 将目标经纬度转换为元组集合(提升匹配效率),然后判断DataFrame每行的经纬度元组是否在集合内,取反筛选即可: ```python import pandas as pd # 目标经纬度列表 target_coords = [[-82.99194508, 40.04649963], [-82.99223727, 40.04659349], [-82.99198391, 40.04614863], [-82.99211513, 40.04627218]] # 转成元组集合 coord_set = set(tuple(coord) for coord in target_coords) # 假设你的DataFrame是df,筛选出不在目标列表的行 filtered_df = df[~df.apply(lambda row: (row['longitude'], row['latitude']) in coord_set, axis=1)]
方法2:Merge反筛选法
把目标经纬度转为临时DataFrame,通过merge标记匹配状态,最后保留未匹配的行:
import pandas as pd target_coords = [[-82.99194508, 40.04649963], [-82.99223727, 40.04659349], [-82.99198391, 40.04614863], [-82.99211513, 40.04627218]] # 创建临时DataFrame coord_df = pd.DataFrame(target_coords, columns=['longitude', 'latitude']) # 合并并标记匹配情况 merged_df = df.merge(coord_df, on=['longitude', 'latitude'], how='left', indicator=True) # 筛选仅在原DataFrame中存在的行(即未匹配的行) filtered_df = merged_df[merged_df['_merge'] == 'left_only'].drop(columns=['_merge'])
方法3:浮点精度兼容法(可选)
如果经纬度存在浮点精度误差,用numpy.isclose做近似匹配:
import pandas as pd import numpy as np target_coords = [[-82.99194508, 40.04649963], [-82.99223727, 40.04659349], [-82.99198391, 40.04614863], [-82.99211513, 40.04627218]] # 定义近似匹配函数 def is_target_coord(row): for lon, lat in target_coords: if np.isclose(row['longitude'], lon) and np.isclose(row['latitude'], lat): return True return False # 筛选不匹配的行 filtered_df = df[~df.apply(is_target_coord, axis=1)]
内容的提问来源于stack exchange,提问作者Tallion 22
相关产品推荐
相关产品推荐

