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

如何基于Index_ID与Previous_Index_ID生成唯一案例标识

独立案例链唯一标识生成方案

针对你的数据集需求,这里提供一套解决思路,既可以给每条独立的Index_ID-Previous_Index_ID链生成唯一newID,也能处理Index_ID仅年月内唯一、递归错误的问题:

核心思路

  1. 先将Year、Month、Index_ID/Previous_Index_ID拼接成全局唯一键,解决Index_ID跨年月重复的问题;
  2. 使用**并查集(Union-Find)**数据结构替代递归遍历,高效合并连通的记录链,避免递归深度超限的错误;
  3. 基于并查集的根节点为每条链分配唯一标识。

具体实现步骤

1. 生成全局唯一索引键

由于Index_ID仅在对应年月内唯一,我们需要把Year、Month和索引字段拼接,确保每个索引在全数据集中唯一,避免跨年月的重复干扰。

import pandas as pd
from collections import defaultdict

# 加载你的数据集(替换为实际路径)
df = pd.read_csv("your_dataset.csv")

# 生成全局唯一的当前索引键
df["full_index"] = df["Year"].astype(str) + "_" + df["Month"].astype(str) + "_" + df["Index_ID"].astype(str)
# 生成全局唯一的上一个索引键
df["full_prev_index"] = df["Year"].astype(str) + "_" + df["Month"].astype(str) + "_" + df["Previous_Index_ID"].astype(str)

2. 用并查集合并连通链

并查集是处理连通分量问题的高效工具,能快速将关联的索引归为同一组,完全规避递归遍历的深度问题。

class UnionFind:
    def __init__(self):
        self.parent = {}

    # 查找根节点,路径压缩优化
    def find(self, x):
        if x not in self.parent:
            self.parent[x] = x
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

    # 合并两个节点所在的集合
    def union(self, x, y):
        root_x = self.find(x)
        root_y = self.find(y)
        if root_x != root_y:
            self.parent[root_y] = root_x

# 初始化并查集实例
uf = UnionFind()

# 遍历所有记录,合并当前索引与上一个索引的关联关系
for _, row in df.iterrows():
    current_idx = row["full_index"]
    prev_idx = row["full_prev_index"]
    # 跳过空的Previous_Index_ID(链的起始节点)
    if pd.notna(prev_idx) and prev_idx.strip() != "":
        uf.union(current_idx, prev_idx)

# 为每条独立链分配唯一newID
chain_id_map = {}
current_new_id = 1
# 遍历所有全局索引,映射到对应的链ID
for idx in df["full_index"]:
    root_node = uf.find(idx)
    if root_node not in chain_id_map:
        chain_id_map[root_node] = current_new_id
        current_new_id += 1
    # 给对应记录赋值newID
    df.loc[df["full_index"] == idx, "newID"] = chain_id_map[root_node]

3. 结果验证

可以通过以下方式验证结果正确性:

  • 按Personalnumber、Category、newID分组,检查每组内的记录是否能通过full_index和full_prev_index连成完整的链;
  • 确认同一用户同一分类下的不同链,newID是否不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:25:28