如何将Pandas DataFrame两列直接转换为路径列表列表(规避递归限制)
解决Pandas DataFrame层级路径生成问题(避免递归深度限制)
我来帮你搞定这个需求——直接从Pandas DataFrame生成所有从根节点出发的完整层级路径,还能完美避开递归深度不够的问题,毕竟上千级的层级用递归肯定会爆栈。
问题本质拆解
你的数据其实是一个父-子节点组成的有向无环图(DAG),我们要做的就是找到从根节点Account到所有叶子节点(没有子节点的节点)的所有完整路径。递归方法之所以不行,是因为Python默认递归深度只有1000,层级上千直接触发RecursionError,所以我们改用**迭代式的深度优先搜索(DFS)**来处理。
具体实现步骤
1. 先把DataFrame转换成高效的邻接表
首先我们把Name和Includes列转换成一个简单的邻接字典,键是父节点,值是该节点的所有子节点列表,这个转换比你之前的嵌套字典方法简洁太多:
import pandas as pd # 你的示例数据 df = pd.DataFrame({ 'Name': ['Account', 'Product Account', 'Card Account', 'Card Account', 'Token', 'Account'], 'Includes': ['Product Account', 'Card Account', 'Plastic', 'Token', 'Token Vault', 'Savings Account'] }) # 构建邻接表:父节点 -> 子节点列表 adjacency = df.groupby('Name')['Includes'].apply(list).to_dict()
生成的邻接表是这样的,非常直观:
{ 'Account': ['Product Account', 'Savings Account'], 'Product Account': ['Card Account'], 'Card Account': ['Plastic', 'Token'], 'Token': ['Token Vault'] }
2. 迭代式DFS遍历所有路径
用栈来模拟递归过程,完全避开递归深度限制,不管层级有几千级都能正常运行:
def find_all_paths(start_node, adjacency): paths = [] # 栈中每个元素是(当前已走路径, 当前所在节点) stack = [([start_node], start_node)] while stack: current_path, current_node = stack.pop() # 如果当前节点没有子节点,说明是叶子,把这条路径加入结果 if current_node not in adjacency: paths.append(current_path.copy()) continue # 遍历所有子节点,注意反转顺序可以让路径输出和你的示例完全一致(可选) for child in reversed(adjacency[current_node]): new_path = current_path + [child] stack.append((new_path, child)) return paths # 生成所有从Account出发的路径 result = find_all_paths('Account', adjacency) print(result)
输出结果
运行后得到的结果和你想要的完全一致:
[['Account', 'Savings Account'], ['Account', 'Product Account', 'Card Account', 'Token', 'Token Vault'], ['Account', 'Product Account', 'Card Account', 'Plastic']]
如果需要调整路径的输出顺序,只需要去掉reversed()即可,或者根据需求对子节点排序。
为什么这个方法适合大规模数据
- 迭代式DFS用栈存储中间状态,栈是在堆内存中分配的,没有Python递归深度的限制,上千级层级也能轻松处理。
- 邻接表的构建和遍历都是O(n)时间复杂度,性能远优于嵌套字典的转换方式。
- 逻辑清晰,后续维护和扩展都很方便,比如如果要处理多根节点,或者加入循环检测(虽然你的场景不需要),都能快速修改。
内容的提问来源于stack exchange,提问作者njrob
相关产品推荐
相关产品推荐

