如何查找并删除pandas dataframe中超范围的经纬度异常数据
Pandas 经纬度数据集超范围异常值清洗方案
合法取值范围说明
首先明确WGS84坐标系下经纬度的合理取值阈值,超出即为异常数据:
- 纬度(通常列名为
lat/latitude):取值区间为 [-90, 90],-90为南极点,90为北极点 - 经度(通常列名为
lon/lng/longitude):取值区间为 [-180, 180],-180/180为国际日期变更线
第一步:先定位排查异常数据
不建议直接删除异常值,先统计异常规模、查看异常样例,避免误删有效数据:
# 替换成你自己表中对应的经纬度列名 LAT_COL = 'lat' LON_COL = 'lon' # 筛选所有超范围的异常行 abnormal_df = df[ (df[LAT_COL] < -90) | (df[LAT_COL] > 90) | (df[LON_COL] < -180) | (df[LON_COL] > 180) ] # 输出异常统计信息 print(f"总数据量:{len(df)},异常数据量:{len(abnormal_df)},异常占比:{len(abnormal_df)/len(df):.2%}") # 打印前10条异常样例,方便排查异常成因 print("异常数据样例:") print(abnormal_df.head(10))
如果需要单独统计纬度、经度的异常比例,可以用以下代码:
lat_abnormal_cnt = ((df[LAT_COL] < -90) | (df[LAT_COL] > 90)).sum() lon_abnormal_cnt = ((df[LON_COL] < -180) | (df[LON_COL] > 180)).sum() print(f"纬度异常行数:{lat_abnormal_cnt},经度异常行数:{lon_abnormal_cnt}")
注意:如果异常占比超过1%,先排查数据源问题,常见成因包括列名匹配错误、经纬度存为放大1e6的整数值、误将弧度值作为角度值存入、字段类型解析错误等,不要直接批量删除导致数据大量损失。
第二步:过滤异常数据生成清洗后数据集
确认异常数据为无效值后,通过布尔索引保留合法范围的数据即可:
# 保留经纬度同时在合法区间的行,重置索引避免索引断层 df_clean = df[ df[LAT_COL].between(-90, 90, inclusive='both') & df[LON_COL].between(-180, 180, inclusive='both') ].reset_index(drop=True)
清洗完成后就可以直接计算OSM导出用的bounding box,不会再出现范围越界问题:
# OSM要求的bbox格式为(左/西经, 下/南纬, 右/东经, 上/北纬) osm_bbox = ( df_clean[LON_COL].min(), df_clean[LAT_COL].min(), df_clean[LON_COL].max(), df_clean[LAT_COL].max() )
额外注意事项
- 如果需要保留经纬度为空的行单独处理,在筛选条件中追加
| df[LAT_COL].isna() | df[LON_COL].isna()即可,上述默认逻辑会把空值归为异常过滤 - 不要直接对全表使用
dropna()删除空值,会误删其他字段为空但经纬度正常的有效数据 - 如果你的数据集用的不是WGS84坐标系(比如GCJ02、BD09),经纬度合法范围和上述阈值一致,不需要调整筛选条件
内容的提问来源于stack exchange,提问作者AM8564
相关产品推荐
相关产品推荐

