如何基于pandas DataFrame生成网络图边列表并过滤自连接
Pandas 生成无自连接边列表方案
核心逻辑
通过拆分逗号分隔的同事列、行展开、过滤自连接三步完成需求:
- 将
Co-Workers列的逗号分隔字符串拆分为列表 - 列表爆炸为多行,对应每行一个同事关系
- 过滤掉起点、终点相同的自连接记录
可运行代码
import pandas as pd # 样例数据构造,实际使用时替换为你自己的DataFrame即可 df = pd.DataFrame({ 'Name': ['A', 'B', 'C', 'D', 'E'], 'Co-Workers': ['A,B,C,D', 'A,B,C,D', 'A,B,C,E', 'A,B,D,E', 'C,D,E'] }) # 处理逻辑 edge_df = ( df.assign(to=df['Co-Workers'].str.split(',')) # 拆分同事列为列表 .explode('to') # 列表展开为多行 .rename(columns={'Name': 'from'}) # 重命名源列为from .query('from != to') # 过滤自连接 [['from', 'to']] # 只保留边列表需要的两列 ) print(edge_df)
样例输出
| from | to |
|---|---|
| A | B |
| A | C |
| A | D |
| B | A |
| B | C |
| B | D |
| C | A |
| C | B |
| C | E |
| D | A |
| D | B |
| D | E |
| E | C |
| E | D |
可选优化:去重双向边
如果你的网络是无向图,不需要保留A→B和B→A两条重复边,可以追加以下代码:
edge_df['temp_sort'] = edge_df.apply(lambda x: tuple(sorted([x['from'], x['to']])), axis=1) edge_df = edge_df.drop_duplicates('temp_sort')[['from', 'to']]
内容的提问来源于stack exchange,提问作者Hadi
相关产品推荐
相关产品推荐

