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

在同一DataFrame中高效追踪ID变更链获取最终ID的方法

高效追踪ID变更链条获取最终Last ID的方案

针对31k行规模的ID变更DataFrame,要高效追踪每行的最终ID,推荐使用路径压缩的映射查找法,避免循环或重复合并的高开销,具体实现如下:

示例数据

先还原问题中的初始DataFrame:

import pandas as pd

df = pd.DataFrame({
    "Old ID": [1, 2, 3, 6],
    "New ID": [2, 3, 6, 10]
})

实现步骤

1. 构建ID映射字典

将Old ID与New ID的对应关系转为字典,实现O(1)的快速查找:

id_map = df.set_index("Old ID")["New ID"].to_dict()

2. 带路径压缩的最终ID查找函数

通过递归+缓存的方式,将中途节点直接映射到最终ID,后续查询无需重复遍历链条,大幅提升效率:

def get_last_id(node, id_map, cache):
    # 当前节点无后续变更,直接返回自身
    if node not in id_map:
        return node
    # 已缓存过最终ID,直接返回
    if node in cache:
        return cache[node]
    # 递归查找最终ID
    last_id = get_last_id(id_map[node], id_map, cache)
    # 路径压缩:把当前节点直接指向最终ID,后续查询一步到位
    cache[node] = last_id
    return last_id

3. 生成Last ID列

初始化缓存字典,对Old ID列批量应用查找函数:

cache = {}
df["Last ID"] = df["Old ID"].apply(lambda x: get_last_id(x, id_map, cache))

最终结果

运行后得到目标DataFrame:

Old ID  New ID  Last ID
0       1       2       10
1       2       3       10
2       3       6       10
3       6      10       10

效率说明

这种方法利用路径压缩优化,每个ID最多被遍历2次(首次查找+缓存写入),时间复杂度接近O(n),完全适配31k行的大规模数据集,不会出现循环或合并操作带来的性能瓶颈。

内容的提问来源于stack exchange,提问作者Lucio Diprè

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:15:17