You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DataFrame转换为streamlit_tree_select所需的父子嵌套字典结构?

将DataFrame转换为streamlit_tree_select所需的嵌套字典结构

要实现这个需求,我们可以通过分组查询+递归构建的方式快速完成层级结构的转换,具体步骤如下:

实现思路

  1. 将DataFrame转换为以idnr为键的字典,方便快速定位任意节点
  2. 用groupby('parkey')将所有节点按父ID分组,快速获取任意父节点对应的子节点列表
  3. 从根节点(parkey=0的节点)开始,递归为每个节点添加children字段,挂载对应的子节点

完整代码示例

import pandas as pd

# 示例数据
data = [
  {"idnr": 1,"parkey": 0,"descr": "A","info":"string"},
  {"idnr": 2,"parkey": 0,"descr": "B","info":"string"},
  {"idnr": 3,"parkey": 2,"descr": "B B 1","info":"string"},
  {"idnr": 4,"parkey": 3,"descr":"B B B 1","info":"string"},
  {"idnr": 5,"parkey": 3,"descr":"B B B 2","info":"string"}
]

df = pd.DataFrame(data)

# 按父ID分组,记录每个父ID对应的子节点ID列表
children_map = df.groupby('parkey')['idnr'].groups

# 将DataFrame转为字典,用idnr作为键,便于快速查找节点
node_lookup = df.set_index('idnr').T.to_dict('dict')

# 递归构建树结构
def build_node_tree(node_id):
    current_node = node_lookup[node_id].copy()
    # 如果当前节点有子节点,递归添加children字段
    if node_id in children_map:
        current_node['children'] = [build_node_tree(child_id) for child_id in children_map[node_id]]
    return current_node

# 提取所有根节点(parkey=0)并构建完整树
root_node_ids = df[df['parkey'] == 0]['idnr'].tolist()
output = [build_node_tree(node_id) for node_id in root_node_ids]

# 输出结果
print(output)

代码说明

  • children_map:通过分组得到的父ID与子节点ID的映射,避免每次查找子节点都遍历整个DataFrame
  • node_lookup:将每个节点转为字典并以idnr索引,实现O(1)时间复杂度的节点查询
  • build_node_tree:递归函数,负责为当前节点挂载所有子节点,子节点会继续递归处理自身的子节点

运行代码后得到的output结构完全符合期望格式,可以直接传入streamlit_tree_select组件使用。

内容的提问来源于stack exchange,提问作者HedgeHog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:05:21