如何将DataFrame转换为streamlit_tree_select所需的父子嵌套字典结构?
将DataFrame转换为streamlit_tree_select所需的嵌套字典结构
要实现这个需求,我们可以通过分组查询+递归构建的方式快速完成层级结构的转换,具体步骤如下:
实现思路
- 将DataFrame转换为以
idnr为键的字典,方便快速定位任意节点 - 用
groupby('parkey')将所有节点按父ID分组,快速获取任意父节点对应的子节点列表 - 从根节点(
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的映射,避免每次查找子节点都遍历整个DataFramenode_lookup:将每个节点转为字典并以idnr索引,实现O(1)时间复杂度的节点查询build_node_tree:递归函数,负责为当前节点挂载所有子节点,子节点会继续递归处理自身的子节点
运行代码后得到的output结构完全符合期望格式,可以直接传入streamlit_tree_select组件使用。
内容的提问来源于stack exchange,提问作者HedgeHog
相关产品推荐
相关产品推荐

