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

Python Pandas:创建含节点对与边强度的DataFrame及数据格式转换问题

解决方法:将项目-实体长格式数据转换为网络图边数据

嘿,这个需求我之前做合作网络图的时候刚好遇到过!核心就是把每个项目里的实体两两配对,然后统计每对搭档一起参与的项目数——这就是你要的边强度。我给你一步步拆解实现:

1. 先模拟你的输入数据

首先我造一个符合你描述的示例DataFrame(方便你直接测试):

import pandas as pd

# 模拟3个项目、多个实体参与的场景
data = {
    'Project_ID': ['P1', 'P1', 'P1', 'P2', 'P2', 'P3', 'P3', 'P3'],
    'Participating_entity': ['A', 'B', 'C', 'A', 'B', 'B', 'C', 'D']
}
df = pd.DataFrame(data)

2. 生成实体两两配对

我们需要按项目分组,对每个项目里的所有实体生成无序的两两组合(因为合作关系是双向的,A和B合作与B和A合作是同一条边):

from itertools import combinations

# 定义分组处理函数:生成当前项目内的所有实体对
def get_entity_pairs(group):
    # 提取当前项目的所有实体列表
    entities = group['Participating_entity'].tolist()
    # 生成两两无序组合(避免重复反向对)
    return pd.DataFrame(combinations(entities, 2), columns=['Entity1', 'Entity2'])

# 按项目分组应用函数,然后展开结果
pair_df = df.groupby('Project_ID').apply(get_entity_pairs).reset_index(drop=True)

3. 统计边强度(共同参与项目数)

最后统计每对实体共同出现在多少个项目里,这个计数就是边的强度:

# 按实体对分组,统计出现次数
edge_df = pair_df.groupby(['Entity1', 'Entity2']).size().reset_index(name='Edge_Strength')

# 输出结果
print(edge_df)

输出结果示例

运行后你会得到这样的边数据:

Entity1 Entity2  Edge_Strength
0       A       B              2
1       A       C              1
2       B       C              2
3       B       D              1
4       C       D              1

额外优化建议

  • 如果你的项目里可能出现同一实体重复参与的情况,记得先在分组里去重:entities = group['Participating_entity'].unique().tolist()
  • 如果需要处理有向图(比如A邀请B参与项目和B邀请A是不同边),把combinations换成permutations
  • 万一不小心生成了反向对(比如(B,A)),可以统一实体顺序:
# 确保Entity1始终是字典序更小的那个
pair_df[['Entity1', 'Entity2']] = pd.DataFrame(
    pair_df.apply(lambda x: sorted([x['Entity1'], x['Entity2']]), axis=1).tolist()
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:47:04