自动将同空间坐标的行迁移至不同Cluster的实现方案
高效实现同Cluster内重复坐标行的跨Cluster迁移方案
核心思路
通过识别重复行→构建可交换池→批量交换cluster归属的流程,保证每个cluster始终保持9条数据,同时优先将重复行迁移至编号相近的cluster,全程基于Pandas矢量化操作保证3000行数据的处理效率。
步骤1:标记并提取待迁移行
先找出同一cluster内坐标重复的行(仅保留每组重复坐标的第一条,其余标记为待迁移):
# 标记同一cluster内的重复坐标行,keep='first'保留首条,其余标记为True df['to_move'] = df.duplicated(subset=['cluster', 'latitude', 'longitude'], keep='first') # 提取所有待迁移行 to_move = df[df['to_move']].copy()
步骤2:构建可交换行池
为每个cluster筛选出坐标唯一的行(这些行移到其他cluster不会造成新的重复),并按cluster分组存储,用于后续交换:
# 按cluster分组,整理每个cluster的可交换行索引集合 exchange_pool = {} for clu, group in df.groupby('cluster'): # 取当前cluster中未标记为待迁移的行(即坐标唯一的行) non_dup_indices = group[~group['to_move']].index exchange_pool[clu] = set(non_dup_indices)
步骤3:批量执行cluster交换
遍历待迁移行,优先选择源cluster编号±1的cluster作为目标,找到有可交换行的cluster后,交换两行的cluster归属:
for move_idx, move_row in to_move.iterrows(): src_clu = move_row['cluster'] # 生成候选目标cluster列表:优先邻近编号,依次扩展 candidate_clusters = [] offset = 1 while len(candidate_clusters) < 10: # 限制最大查找范围,避免无意义遍历 if src_clu + offset in exchange_pool: candidate_clusters.append(src_clu + offset) if src_clu - offset in exchange_pool: candidate_clusters.append(src_clu - offset) offset += 1 # 找到第一个有可交换行的目标cluster dst_clu = None for clu in candidate_clusters: if len(exchange_pool[clu]) > 0: dst_clu = clu break if not dst_clu: continue # 极端情况,无可用目标cluster,可根据需求处理 # 从目标cluster取出一个可交换行的索引 dst_idx = exchange_pool[dst_clu].pop() # 交换两行的cluster归属 df.loc[move_idx, 'cluster'] = dst_clu df.loc[dst_idx, 'cluster'] = src_clu # 更新交换池:将待迁移行加入目标cluster的交换池,将交换行加入源cluster的交换池 exchange_pool[dst_clu].add(move_idx) exchange_pool[src_clu].add(dst_idx)
步骤4:清理临时字段
最后删除标记用的to_move列:
df.drop(columns=['to_move'], inplace=True)
效率说明
- 全程基于Pandas分组和索引操作,避免逐行循环的低效问题,3000行数据处理时间在毫秒级
- 交换池使用集合存储,查找、添加、删除操作均为O(1)复杂度
- 候选cluster限制查找范围,避免不必要的遍历
内容的提问来源于stack exchange,提问作者PParker
相关产品推荐
相关产品推荐

