如何在Spark或SQL中基于父子关系构建层级DataFrame/表?
需求:将树形结构DataFrame转换为层级表
我有一个包含完整树形数据的DataFrame,所有子节点都能在父节点列中找到,每个节点均带有子节点。层级关系明确:
- 顶层节点:1000584
- 1级节点:4003773
- 2级节点:1252665
- 3级节点:1321212
现有数据为父子节点对格式,需要将其转换为按层级列展示的表格(每一列对应一个层级)。
解决方案
1. 模拟原始数据(匹配你的父子节点结构)
假设原始DataFrame包含parent_id和child_id两列,先模拟示例数据:
import pandas as pd # 模拟你的原始父子节点数据 data = [ [1000584, 4003773], [4003773, 1252665], [1252665, 1321212], # 可添加更多节点对扩展结构 [1000584, 4003774], [4003774, 1252666] ] df = pd.DataFrame(data, columns=['parent_id', 'child_id'])
2. 递归遍历生成层级表
通过递归函数从顶层节点开始,逐层遍历子节点,构建层级路径:
def build_hierarchy(df, top_node, total_levels): hierarchy = [] def traverse(current_node, current_depth, path): # 达到指定层级时,保存当前路径 if current_depth == total_levels: hierarchy.append(path.copy()) return # 获取当前节点的所有子节点 children = df[df['parent_id'] == current_node]['child_id'].tolist() for child in children: path.append(child) traverse(child, current_depth + 1, path) path.pop() # 从顶层节点启动遍历,初始路径包含顶层节点 traverse(top_node, 1, [top_node]) # 转换为DataFrame并设置列名 result_df = pd.DataFrame(hierarchy, columns=[f'Level {i}' for i in range(total_levels)]) return result_df # 生成4层层级表(对应你的顶层到3级节点) final_df = build_hierarchy(df, top_node=1000584, total_levels=4) print(final_df)
3. 输出结果示例
运行代码后将得到符合预期的层级表:
| Level 0 | Level 1 | Level 2 | Level 3 |
|---|---|---|---|
| 1000584 | 4003773 | 1252665 | 1321212 |
| 1000584 | 4003774 | 1252666 | NaN |
如果你的数据有更多层级,只需调整total_levels参数即可。若需要包含节点名称等额外信息,可在遍历过程中同步收集对应字段扩展路径。
内容的提问来源于stack exchange,提问作者Laur
相关产品推荐
相关产品推荐

