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

跨列关联数据掩码处理:按ID1关联关系分组展示ID2值

解决ID1关联ID2的分组展示问题

针对需求:将数据集中每个ID1直接或间接关联的所有ID2值分组展示,仅每组首行保留ID1值,其余行ID1置空,以下是基于Python Pandas的实现方案。

问题示例

输入数据集:

ID1  ID2
0    1    2
1    1    4
2    2    6
3    2    5
4    3    7

期望输出:

ID1  ID2
   1    2
       4
       6
       5
   3    7

方案一:使用NetworkX处理图遍历

借助图论库NetworkX可以快速实现节点的关联遍历,步骤如下:

  1. 导入依赖库并加载数据
import pandas as pd
import networkx as nx

# 加载输入数据(实际场景可替换为pd.read_csv等方式)
df = pd.DataFrame({
    'ID1': [1,1,2,2,3],
    'ID2': [2,4,6,5,7]
})
  1. 构建有向图并定义关联节点获取函数
# 构建有向图,将ID1与ID2的关联关系转化为边
G = nx.DiGraph()
for _, row in df.iterrows():
    G.add_edge(row['ID1'], row['ID2'])

# 获取指定ID1的所有直接/间接关联ID2节点
def get_all_related(id_val):
    # 获取从id_val出发可到达的所有节点(排除自身)
    return sorted(nx.descendants(G, id_val))
  1. 生成结果数据集
result_data = []
processed_ids = set()

# 遍历所有唯一ID1,跳过已处理的关联ID1
for id1 in df['ID1'].unique():
    if id1 not in processed_ids:
        related_ids = get_all_related(id1)
        # 首行保留ID1值,其余行ID1置空
        result_data.append({'ID1': id1, 'ID2': related_ids[0]})
        for id2 in related_ids[1:]:
            result_data.append({'ID1': '', 'ID2': id2})
        # 标记当前ID1及关联的ID1为已处理,避免重复分组
        processed_ids.add(id1)
        for node in related_ids:
            if node in df['ID1'].unique():
                processed_ids.add(node)

# 转换为DataFrame并输出
result_df = pd.DataFrame(result_data)
print(result_df.to_string(index=False))

方案二:纯Pandas递归遍历(无额外依赖)

如果不想引入第三方库,可通过递归遍历ID映射关系实现:

  1. 加载数据并构建ID映射
import pandas as pd

df = pd.DataFrame({
    'ID1': [1,1,2,2,3],
    'ID2': [2,4,6,5,7]
})

# 构建ID1到直接关联ID2的映射字典
id_map = df.groupby('ID1')['ID2'].apply(list).to_dict()
  1. 定义递归遍历函数获取所有关联节点
def get_all_related(id_val, visited=None):
    if visited is None:
        visited = set()
    # 遍历当前ID1的直接关联ID2
    if id_val in id_map:
        for id2 in id_map[id_val]:
            if id2 not in visited:
                visited.add(id2)
                # 递归处理ID2作为ID1的情况
                get_all_related(id2, visited)
    return sorted(visited)
  1. 生成结果数据集(同方案一的结果生成逻辑)
result_data = []
processed_ids = set()

for id1 in df['ID1'].unique():
    if id1 not in processed_ids:
        related_ids = get_all_related(id1)
        result_data.append({'ID1': id1, 'ID2': related_ids[0]})
        for id2 in related_ids[1:]:
            result_data.append({'ID1': '', 'ID2': id2})
        processed_ids.add(id1)
        for node in related_ids:
            if node in id_map:
                processed_ids.add(node)

result_df = pd.DataFrame(result_data)
print(result_df.to_string(index=False))

说明

  • 两种方案核心逻辑一致:先找出每个ID1的所有直接/间接关联ID2,再按格式组织结果。
  • 方案一借助NetworkX简化了图遍历逻辑,适合复杂关联场景;方案二无额外依赖,轻量易用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:01:09