如何计算DataFrame中不同ID组首尾经纬度差值并筛选符合范围的ID对
解决方案:计算不同ID间经纬度差值并筛选符合条件的ID对
首先我们需要先提取每个ID的第一条(最小Counter)和最后一条(最大Counter)记录的经纬度,再生成所有不同的ID对计算差值,最后筛选出符合范围的结果。以下是基于pandas的完整实现:
步骤1:预处理数据并提取关键记录
首先确保数据按ID和Counter排序,这样能准确获取每个ID的首尾记录:
import pandas as pd # 先按ID和Counter排序,保证首尾记录对应最小/最大Counter df_sorted = df.sort_values(['ID', 'Counter']) # 提取每个ID的第一条记录的经纬度 first_records = df_sorted.groupby('ID').agg( first_lat=('Latitude', 'first'), first_lon=('Longitude', 'first') ).reset_index() # 提取每个ID的最后一条记录的经纬度 last_records = df_sorted.groupby('ID').agg( last_lat=('Latitude', 'last'), last_lon=('Longitude', 'last') ).reset_index()
步骤2:生成所有不同的ID对并计算差值
通过笛卡尔积合并首尾记录,排除ID相同的无效情况,然后计算经纬度差值:
# 添加临时键实现笛卡尔积合并,得到所有可能的ID组合 first_records['temp_key'] = 1 last_records['temp_key'] = 1 all_pairs = pd.merge( last_records, first_records, on='temp_key', suffixes=('_last', '_first') ).drop('temp_key', axis=1) # 排除ID相同的对(自己和自己的无意义对比) all_pairs = all_pairs[all_pairs['ID_last'] != all_pairs['ID_first']] # 计算纬度差和经度差 all_pairs['latitude_diff'] = all_pairs['last_lat'] - all_pairs['first_lat'] all_pairs['longitude_diff'] = all_pairs['last_lon'] - all_pairs['first_lon']
步骤3:筛选符合差值范围的ID对
根据你的需求自定义差值范围,这里以纬度差在[-0.5, 0.5]、经度差在[-0.5, 0.5]为例:
# 自定义差值范围,可根据实际需求修改 lat_range = (-0.5, 0.5) lon_range = (-0.5, 0.5) # 筛选符合条件的ID对 filtered_pairs = all_pairs[ all_pairs['latitude_diff'].between(*lat_range) & all_pairs['longitude_diff'].between(*lon_range) ] # 保留核心结果列,方便查看 final_result = filtered_pairs[['ID_last', 'ID_first', 'latitude_diff', 'longitude_diff']] print(final_result)
可选:获取无序唯一ID对
如果不需要区分(AAA, BBB)和(BBB, AAA)这类反向对,可以添加以下代码去重:
# 生成有序的ID对标识,用于去重 filtered_pairs['sorted_id_pair'] = filtered_pairs.apply( lambda row: tuple(sorted([row['ID_last'], row['ID_first']])), axis=1 ) # 去重后保留唯一无序对 unique_pairs = filtered_pairs.drop_duplicates('sorted_id_pair').drop('sorted_id_pair', axis=1)
这个方案可以灵活调整差值范围,也能处理任意数量的ID数据,完全适配你给出的DataFrame结构。
内容的提问来源于stack exchange,提问作者sei lee
相关产品推荐
相关产品推荐

