如何在Python Pandas中基于多对多关系的两个ID创建分组ID
用Pandas和NetworkX实现关联ID的分组(连通分量标记)
你的需求本质是识别ID1和ID2之间的连通关联组——只要两个ID(不管是ID1还是ID2)通过任意行的关联链连接起来,就属于同一组。这是典型的图论连通分量问题,可以用NetworkX库快速解决。
实现步骤
- 先安装NetworkX(未安装的话执行):
pip install networkx
- 编写代码:
import pandas as pd import networkx as nx # 构造输入数据 data = { 'ID 1': [1, 1, 2, 3, 3, 4], 'ID 2': [1, 2, 3, 4, 5, 5] } df = pd.DataFrame(data) # 创建无向图,把每行的ID1和ID2作为一条边添加进去 G = nx.Graph() G.add_edges_from(df[['ID 1', 'ID 2']].values) # 给每个连通分量分配唯一ID,建立节点到分量ID的映射 component_map = {} for group_id, component in enumerate(nx.connected_components(G), start=1): for node in component: component_map[node] = group_id # 生成ID3列:同一行的ID1和ID2必然属于同一分量,取任意一个映射即可 df['ID 3'] = df['ID 1'].map(component_map) print(df)
代码说明
- 图结构构建:把每行的
ID 1和ID 2视为图的两个节点,行本身就是连接节点的边。比如ID1=1关联ID2=1和ID2=2,所以1、2两个节点属于同一个连通组。 - 连通分量识别:
nx.connected_components(G)会返回所有互相连通的节点集合,我们给每个集合分配从1开始的唯一ID。 - 映射到原数据:因为同一行的两个ID必然在同一组,所以用
ID 1去匹配分量ID即可得到ID 3。
运行后输出结果和你期望的一致:
ID 1 ID 2 ID 3 0 1 1 1 1 1 2 1 2 2 3 2 3 3 4 3 4 3 5 3 5 4 5 3
额外提示
- 如果处理超大规模数据集,可替换为
igraph库,性能会更优。 - 分组完成后,你可以基于
ID 3对关联的唯一值求和,确保每个组内的关联值无重复统计、全覆盖,满足后续的互除计算需求。
内容的提问来源于stack exchange,提问作者Josh Tysseling
相关产品推荐
相关产品推荐

