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

如何高效获取DataFrame中项目合作成员的全排列配对?

高效获取项目合作成员的全排列配对(含双向组合)

现有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({
    'project_id': [1,1,1,2,2,2],
    'member_id': ['A','B','C','A','D','B']
})

需要找出所有在至少一个项目中合作过的成员配对(包含全排列形式,即A-B与B-A均需保留),期望结果如下:

# 期望结果
result = pd.DataFrame({
    'member_id': ['A','A','A','B','B','B','C','C','D','D'],
    'co_member_id': ['B','C','D','A','C','D','A','B','A','B']
})

我目前的思路是用df.groupby('project_id'),对每个分组计算成员的两两全排列后去重,但想了解更高效的实现方式。


高效实现方案:利用自连接(Self Join)+ 去重

这种方法依赖Pandas的向量化操作,避免了循环分组的开销,在数据量较大时性能优势明显:

# 1. 自连接:匹配同一项目下的成员,排除自身配对
joined = df.merge(df, on='project_id', suffixes=('', '_co'))
joined = joined[joined['member_id'] != joined['member_id_co']]

# 2. 提取目标列并重命名
result = joined[['member_id', 'member_id_co']].rename(columns={'member_id_co': 'co_member_id'})

# 3. 去重:移除不同项目中重复的配对(比如A-B在项目1和2都出现,只保留一次)
result = result.drop_duplicates().reset_index(drop=True)

为什么这个方法更高效?

  • 向量化操作:Pandas的merge是基于底层优化的向量化运算,比遍历每个分组并生成排列的循环操作快得多,尤其是当项目数量和成员数量较多时。
  • 减少冗余计算:直接通过连接条件过滤掉自身配对,不需要先生成所有排列再过滤,大幅降低了中间数据的规模。

对比原思路的优势

原思路中groupby后逐组调用itertools.permutations,本质是逐组循环处理,当数据规模较大时,循环的开销会显著增加。而自连接的方式利用了Pandas的内部优化,能更好地利用CPU资源,处理速度提升明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:32