跨列关联数据掩码处理:按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可以快速实现节点的关联遍历,步骤如下:
- 导入依赖库并加载数据
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] })
- 构建有向图并定义关联节点获取函数
# 构建有向图,将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))
- 生成结果数据集
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映射关系实现:
- 加载数据并构建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()
- 定义递归遍历函数获取所有关联节点
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)
- 生成结果数据集(同方案一的结果生成逻辑)
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
相关产品推荐
相关产品推荐

