如何基于地理坐标识别Pandas数据集中的重复城市条目?
基于地理数据识别重复城市条目的解决方案
你的固定点距离分组方案不可行——你无法提前知晓每个城市的精准中心点,而且不同城市的点可能与某个固定点距离相近,导致误分组。以下是更可靠的解决思路:
1. 优先使用DBSCAN空间聚类算法
这是最适配你场景的方法,它不需要提前指定聚类数量,能根据点的密度自动识别聚集的城市点:
- 核心参数:
eps:邻域半径,设置两个点被判定为同一组的最大地理距离(比如1公里,需用球面距离计算)min_samples:一个聚类的最小点数(比如设为2,避免单个点被误判为聚类)
- 实现步骤:
- 用Haversine公式计算任意两点间的球面距离(不能用欧氏距离,经纬度是球面坐标)
- 用DBSCAN对所有经纬度点聚类,同一聚类内的条目即为潜在重复的城市
- 示例适配:你提供的"New York"和"Neww York"经纬度计算出的距离极近,会被分到同一聚类,而Berlin的点距离远,单独成类
2. 分层聚类(适合小数据集)
如果数据量不大,可以用分层聚类:
- 先将每个点视为独立聚类,不断合并距离最近的聚类,直到合并后的聚类间距离超过你设定的阈值(比如1公里)
- 优点是可手动调整合并阈值,缺点是计算量随数据量增长快速上升
3. 网格划分法(快速简便方案)
把地图划分成固定大小的网格(比如1x1公里),落在同一网格内的点视为同一城市:
- 优点是实现简单、计算快;缺点是网格大小难把控,过大可能混进不同城市的点,过小可能拆分同一城市的点
关键细节补充
- 必须用球面距离计算:以下是Haversine公式的Python实现示例:
import math def haversine(lon1, lat1, lon2, lat2): # 经纬度转弧度 lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) dlon = lon2 - lon1 dlat = lat2 - lat1 a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 c = 2 * math.asin(math.sqrt(a)) # 地球平均半径(公里) earth_radius = 6371 return c * earth_radius - 参数调优:
eps需根据城市规模调整,大城市可设为3-5公里,小城市设为1公里,可先抽样计算已知重复点的距离范围来确定 - 结果验证:聚类后建议人工抽查部分结果,调整参数提升准确率
内容的提问来源于stack exchange,提问作者Blowsh1t
相关产品推荐
相关产品推荐

