如何基于DataFrame多列唯一值创建加权邻接矩阵?
多列DataFrame生成加权邻接矩阵
核心思路
每一行中的所有元素(国家、机构、部门、个人)属于同一关联组,我们需要统计任意两个元素在同一行中共同出现的次数,以此作为邻接矩阵的权重值。
实现步骤
- 构建示例数据
import pandas as pd import itertools data = { '国家': ['USA', 'UK', 'China', 'Argentina'], '机构': ['Apple', 'Apple', 'Apple', 'Bosch'], '部门': ['Marketing', 'Marketing', 'Finance', 'Marketing'], '个人': ['John Fowler', 'Peter Pan', 'John Fowler', 'Messi'] } df = pd.DataFrame(data)
- 生成行内元素的所有有序配对
遍历每一行,提取所有元素并生成两两有序组合,确保双向关联都被统计(比如USA和Apple的关联,同时记录(USA, Apple)和(Apple, USA)):
pairs = [] for _, row in df.iterrows(): elements = row.tolist() # 生成所有两两有序配对 for pair in itertools.permutations(elements, 2): pairs.append(pair)
- 统计配对次数并构建邻接矩阵
将配对数据转为DataFrame,利用交叉表统计次数,最后将对角线值设为0(自身无连接):
pair_df = pd.DataFrame(pairs, columns=['source', 'target']) # 生成加权邻接矩阵 adj_matrix = pd.crosstab(pair_df['source'], pair_df['target']) # 对角线元素置0 for idx in adj_matrix.index: adj_matrix.loc[idx, idx] = 0
- 输出结果
执行print(adj_matrix)即可得到你需要的加权邻接矩阵,与示例完全匹配。
补充说明
- 使用
itertools.permutations而非combinations,是为了直接生成双向配对,无需后续手动对称填充矩阵; - 交叉表
pd.crosstab会自动统计每个配对出现的次数,正好对应邻接矩阵的权重值。
内容的提问来源于stack exchange,提问作者Beavis
相关产品推荐
相关产品推荐

