如何在R中建立列值间关联并构建网络图?
基于共同Manager生成关联Location并构建网络图
需求说明
给定如下数据框:
| Location | Manager |
|---|---|
| L1 | M45 |
| L2 | M45 |
| L34 | M12 |
| L5 | M45 |
| L23 | M12 |
| L4 | M3 |
| L11 | M45 |
需要生成包含Location和Links列的新数据框,Links列存储与该行Location拥有相同Manager的其他所有Location,目标结果示例如下:
| Location | Links |
|---|---|
| L1 | L2,L5 |
| L2 | L1,L5 |
| L5 | L1,L2 |
| L23 | L34 |
| L4 | |
| L11 |
完成后需确认是否可构建对应的网络图。
实现代码(Pandas)
以下是用Python Pandas实现需求的代码:
import pandas as pd # 构造原始数据 data = { 'Location': ['L1', 'L2', 'L34', 'L5', 'L23', 'L4', 'L11'], 'Manager': ['M45', 'M45', 'M12', 'M45', 'M12', 'M3', 'M45'] } df = pd.DataFrame(data) # 按Manager分组,获取每组的Location列表 grouped_locs = df.groupby('Manager')['Location'].apply(list).reset_index(name='group_members') # 合并分组信息到原始数据 merged_df = df.merge(grouped_locs, on='Manager') # 生成Links列:剔除当前Location后拼接剩余项 merged_df['Links'] = merged_df.apply( lambda row: ','.join([loc for loc in row['group_members'] if loc != row['Location']]), axis=1 ) # 提取目标列,得到最终结果 result_df = merged_df[['Location', 'Links']] print(result_df)
代码逻辑说明
- 按
Manager分组,获取每个经理对应的所有Location列表; - 将分组信息合并回原始数据框,让每一行都能获取到同组的所有
Location; - 对每一行,过滤掉自身的
Location,将剩余同组Location用逗号拼接成字符串,存入Links列; - 提取
Location和Links列,得到目标数据框。
网络图构建
完全可以构建对应的网络图,具体实现如下:
核心逻辑
- 节点:所有
Location; - 边:两个
Location拥有相同Manager时,在它们之间建立无向边。
实现代码(NetworkX)
import networkx as nx import matplotlib.pyplot as plt # 初始化无向图 G = nx.Graph() # 添加所有Location作为节点 G.add_nodes_from(df['Location']) # 为同Manager组内的Location添加两两连接 for _, group in df.groupby('Manager'): locs = group['Location'].tolist() # 生成组内所有两两组合,添加边 for i in range(len(locs)): for j in range(i+1, len(locs)): G.add_edge(locs[i], locs[j]) # 绘制网络图 plt.figure(figsize=(8, 6)) nx.draw(G, with_labels=True, node_size=1500, node_color='lightblue', font_size=12) plt.title('Location Network (Connected by Shared Manager)') plt.show()
运行代码后会生成可视化网络图,直观展示哪些Location因共同经理而关联。
内容的提问来源于stack exchange,提问作者k34l
相关产品推荐
相关产品推荐

