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

如何在Python Pandas中基于多对多关系的两个ID创建分组ID

用Pandas和NetworkX实现关联ID的分组(连通分量标记)

你的需求本质是识别ID1和ID2之间的连通关联组——只要两个ID(不管是ID1还是ID2)通过任意行的关联链连接起来,就属于同一组。这是典型的图论连通分量问题,可以用NetworkX库快速解决。

实现步骤

  1. 先安装NetworkX(未安装的话执行):
pip install networkx
  1. 编写代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:20:16