如何从含命题与作者列的DataFrame生成网络分析用edge-list?
同一命题下作者两两关联的Edge-List生成实现
核心思路
按命题分组,对每组内的作者生成所有不重复的两两组合,再将组合与对应命题拼接成目标格式的DataFrame。
代码实现(基础版)
import pandas as pd from itertools import combinations # 构造示例输入数据 input_data = { 'Proposition': ['A', 'A', 'A', 'A', 'B', 'B'], 'Author': [1, 2, 3, 4, 2, 4] } df = pd.DataFrame(input_data) # 初始化存储边列表的容器 edge_list = [] # 按命题分组处理 for prop, author_group in df.groupby('Proposition'): # 获取当前命题下的所有作者 authors = author_group['Author'].tolist() # 生成所有两两不重复的组合 for pair in combinations(authors, 2): edge_list.append({ 'Proposition': prop, 'Author 1 (From)': pair[0], 'Author 2 (To)': pair[1] }) # 转换为目标DataFrame result_df = pd.DataFrame(edge_list) print(result_df)
代码实现(Pandas链式操作版)
如果习惯用更简洁的Pandas链式写法,可以用下面的代码:
import pandas as pd from itertools import combinations df = pd.DataFrame({ 'Proposition': ['A', 'A', 'A', 'A', 'B', 'B'], 'Author': [1, 2, 3, 4, 2, 4] }) result_df = ( df.groupby('Proposition')['Author'] .apply(lambda authors: pd.DataFrame(list(combinations(authors, 2)), columns=['Author 1 (From)', 'Author 2 (To)'])) .reset_index() .drop(columns='level_1') .rename(columns={'level_0': 'Proposition'}) )
结果说明
两种方法运行后都会生成你需要的Edge-List格式DataFrame,和示例输出完全一致:
| Proposition | Author 1 (From) | Author 2 (To) |
|---|---|---|
| A | 1 | 2 |
| A | 1 | 3 |
| A | 1 | 4 |
| A | 2 | 3 |
| A | 2 | 4 |
| A | 3 | 4 |
| B | 2 | 4 |
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

