如何将Python DataFrame转换为以唯一节点为键的分组字典结构
问题描述
有如下示例DataFrame:
| Start | end | value |
|---|---|---|
| A | B | 1 |
| A | C | 2 |
| B | D | 3 |
| C | A | 2 |
需要将其转换为如下格式的字典:
{ 'A': [('B',1),('C',2)] ,'B': [('D',3)] ,'C': [('A',2)] ,'D':[] }
解决方案
可以通过以下步骤实现需求:
- 收集所有节点:提取
Start和end列的所有唯一值,确保字典包含所有出现过的节点(包括仅作为终点的D)。 - 构建对应关系:按
Start列分组,将每组的end与value组合成元组,再整理为列表。 - 补全空节点:对没有起始记录的节点,赋值为空列表。
代码实现
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Start': ['A', 'A', 'B', 'C'], 'end': ['B', 'C', 'D', 'A'], 'value': [1, 2, 3, 2] }) # 获取所有唯一节点 all_nodes = pd.concat([df['Start'], df['end']]).unique() # 初始化结果字典并填充数据 result = {} for node in all_nodes: target_rows = df[df['Start'] == node] result[node] = list(zip(target_rows['end'], target_rows['value'])) print(result)
运行后输出结果:
{'A': [('B', 1), ('C', 2)], 'B': [('D', 3)], 'C': [('A', 2)], 'D': []}
简洁写法
也可以用groupby结合字典推导式简化代码:
# 分组获取对应关系 grouped_data = df.groupby('Start').apply(lambda x: list(zip(x['end'], x['value']))).to_dict() all_nodes = pd.concat([df['Start'], df['end']]).unique() # 补全空节点 result = {node: grouped_data.get(node, []) for node in all_nodes}
内容的提问来源于stack exchange,提问作者RWWW
相关产品推荐
相关产品推荐

