You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何比较两个Pandas DataFrame的数值?经纬度匹配标记实现方法

比较Pandas DataFrame经纬度并添加存在标记的实现方法

嘿,这个需求在地理数据处理里挺常见的,我给你分享几个实用的Pandas实现方案,附代码示例和细节说明:

先准备示例数据

先构造两个测试用的DataFrame,方便你理解每个方法的效果:

import pandas as pd

# 示例DataFrame A
df_a = pd.DataFrame({
    'lat': [40.7128, 34.0522, 41.8781],
    'lon': [-74.0060, -118.2437, -87.6298]
})

# 示例DataFrame B
df_b = pd.DataFrame({
    'lat': [34.0522, 51.5074],
    'lon': [-118.2437, -0.1278]
})

方法1:用merge结合标记列(最直观)

通过左连接合并两个DataFrame,利用内置的_merge列判断是否匹配,再映射成1/0标记:

# 左连接合并,保留A的所有行,添加匹配状态列
merged_df = df_a.merge(df_b, on=['lat', 'lon'], how='left', indicator=True)

# 将匹配状态转成1/0标记
df_a['exists_in_b'] = merged_df['_merge'].map({'both': 1, 'left_only': 0})

print(df_a)

输出结果:

lat       lon  exists_in_b
0  40.7128  -74.0060            0
1  34.0522 -118.2437            1
2  41.8781  -87.6298            0

这个方法逻辑清晰,适合新手理解,不需要复杂的lambda或者自定义函数。

方法2:用集合+apply(大数据量更高效)

把B的经纬度转成元组集合(集合的查找速度是O(1)),再逐行检查A的经纬度是否在集合中:

# 将B的经纬度组合成元组集合,提升查询效率
b_coords_set = set(zip(df_b['lat'], df_b['lon']))

# 给A添加标记列
df_a['exists_in_b'] = df_a.apply(
    lambda row: 1 if (row['lat'], row['lon']) in b_coords_set else 0,
    axis=1
)

如果你的DataFrame行数很多(比如十万级以上),这个方法比merge要快不少,因为集合的查找性能远优于DataFrame的合并操作。

方法3:用MultiIndex的isin(Pandas原生高效方案)

把两个DataFrame的经纬度转成MultiIndex,直接用isin方法判断存在性,再转成整数类型:

# 将B的经纬度设置为MultiIndex
b_multi_index = df_b.set_index(['lat', 'lon']).index

# 检查A的每个经纬度组合是否在B的索引中,转成1/0
df_a['exists_in_b'] = df_a.set_index(['lat', 'lon']).index.isin(b_multi_index).astype(int)

这个方法完全利用Pandas的内置优化,性能和方法2差不多,而且代码更简洁,不需要写lambda函数。

重要注意事项:处理浮点精度问题

如果你的经纬度是浮点型数据,可能会因为浮点存储的微小误差导致明明应该匹配的行没被识别到。这时候建议先对经纬度进行四舍五入,保留足够的精度(比如6位小数,对应约10厘米的精度,完全满足大多数地理数据需求):

# 对经纬度四舍五入到6位小数,消除精度误差
df_a['lat'] = df_a['lat'].round(6)
df_a['lon'] = df_a['lon'].round(6)
df_b['lat'] = df_b['lat'].round(6)
df_b['lon'] = df_b['lon'].round(6)

处理完精度问题后再执行上面的匹配操作,结果会更准确。

内容的提问来源于stack exchange,提问作者Phil Baines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:38:57