如何重构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
相关产品推荐
相关产品推荐

