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

如何重构pandas DataFrame以生成网络图所需的源目标权重数据表

实现方案

你可以按分组生成配对后统计频次实现需求,完整代码如下:

import pandas as pd
from itertools import pairwise

# 生成测试数据
df = pd.DataFrame({
    'Group1': ['A','A','A','A', 'A','A','A', 'A','A','A', 'A','A','A', 'A','A'],
    'Group2': ['A','A','A','A', 'A','A','A', 'A','A','A', 'A','A','A', 'A','A'],
    'Group3': ['A','A','A','A','A','B','C','C','C','C','C','C','C','C','C'],
    'Asset': ['MI','JI','MI','JI','MI','MI','MI','PA','MI','PA','MI','PA','MI','PA','MI']
})

pair_list = []
# 按三个分组字段分组处理
for _, group in df.groupby(['Group1', 'Group2', 'Group3'])['Asset']:
    assets = group.tolist()
    if len(assets) == 1:
        # 单资产组生成自配对
        pair_list.append((assets[0], assets[0]))
    else:
        # 多资产组取相邻配对后去重,同组内相同配对只计一次
        group_pairs = list(set(pairwise(assets)))
        pair_list.extend(group_pairs)

# 统计配对出现次数,转为目标格式DataFrame
result = (
    pd.Series(pair_list)
    .value_counts()
    .reset_index()
    .rename(columns={'index': 'pair', 0: 'Weight'})
)
result[['Source', 'Target']] = pd.DataFrame(result['pair'].tolist(), index=result.index)
result = result[['Source', 'Target', 'Weight']].sort_values(['Source', 'Target']).reset_index(drop=True)

print(result)

如果你使用的Python版本低于3.10没有pairwise方法,可以用下方自定义函数替代:

def pairwise(iterable):
    from itertools import tee
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

运行后输出的结果和你要求的结构完全一致:

Source Target  Weight
0     JI     MI       1
1     MI     JI       1
2     MI     MI       1
3     MI     PA       1
4     PA     MI       1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:45:07