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

如何识别Debitor ID/CVR ID/KF ID关联并生成唯一客户组ID

生成唯一Client-Group ID的解决方案

这个问题本质是图的连通分量识别:把Debitor ID、CVR ID、KF ID看作图中的独立节点,每行数据的三个ID相当于互相连通的边——只要两个ID通过任意路径关联(比如同一Debitor连不同CVR,同一CVR连不同KF),就属于同一个客户组。最适合的高效解法是用**Union-Find(并查集)**算法,尤其适合处理大型数据集。

实现步骤

  1. 实现Union-Find结构:用来高效管理节点的连通关系,支持快速合并和查找根节点。
  2. 遍历数据合并节点:对每行的三个ID进行两两合并,确保关联的节点都属于同一连通分量。
  3. 生成客户组ID:将每个连通分量的根节点映射为唯一的Client-Group ID,再为每行数据分配对应的ID。

代码示例(Python)

1. 实现Union-Find类

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

    def find(self, node):
        # 路径压缩,加速后续查找
        if self.parent[node] != node:
            self.parent[node] = self.find(self.parent[node])
        return self.parent[node]

    def union(self, node1, node2):
        # 确保节点存在于字典中
        if node1 not in self.parent:
            self.parent[node1] = node1
        if node2 not in self.parent:
            self.parent[node2] = node2
        # 合并两个节点的连通分量
        root1 = self.find(node1)
        root2 = self.find(node2)
        if root1 != root2:
            self.parent[root2] = root1

2. 处理数据集生成分组ID

# 示例数据集,替换为你的实际数据(比如从CSV读取)
data = [
    ("D001", "C001", "K001"),
    ("D001", "C002", "K001"),
    ("D002", "C002", "K002"),
    ("D003", "C003", "K001"),
]

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

# 合并所有关联节点
for debitor_id, cvr_id, kf_id in data:
    # 给每个维度ID加前缀,避免不同维度ID重复导致混淆
    debitor_node = f"Debitor_{debitor_id}"
    cvr_node = f"CVR_{cvr_id}"
    kf_node = f"KF_{kf_id}"
    # 合并三个节点,形成连通分量
    uf.union(debitor_node, cvr_node)
    uf.union(cvr_node, kf_node)

# 将根节点映射为连续整数的分组ID(可选,让ID更简洁)
group_map = {}
current_group = 1
for node in uf.parent:
    root = uf.find(node)
    if root not in group_map:
        group_map[root] = current_group
        current_group += 1

# 为每行数据分配Client-Group ID
result = []
for debitor_id, cvr_id, kf_id in data:
    node = f"Debitor_{debitor_id}"
    root = uf.find(node)
    group_id = group_map[root]
    result.append({
        "Debitor ID": debitor_id,
        "CVR ID": cvr_id,
        "KF ID": kf_id,
        "Client-Group ID": group_id
    })

# 输出结果
for item in result:
    print(item)

关键注意事项

  • 维度ID去重:如果不同维度的ID可能存在数值/字符串重复(比如Debitor ID和CVR ID都有"123"),必须给每个维度的ID添加前缀(如Debitor_123、CVR_123),避免节点混淆。
  • 性能优化:Union-Find的路径压缩和按秩合并(示例中用了路径压缩,可额外添加按秩合并进一步优化)能让算法接近线性时间复杂度,适合处理百万级以上的大型数据集。
  • 分组ID灵活性:可以直接用根节点字符串作为分组ID,无需映射为整数;映射整数是为了让ID更简洁易读,便于后续统计分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:55:25