如何在Python中自动生成DataFrame点位路径并存入字典
批量生成DataFrame编码的完整路径字典方案
你的需求很明确:给DataFrame里每个COL_A的编码生成从它出发到无后续节点的完整路径链,最后输出成{COL_A编码: 路径列表}的字典。原来的递归函数依赖全局变量,只能手动单条处理,确实没法批量搞,我来帮你重构一下代码。
问题分析
原来的代码用了全局变量list_for_output,递归的时候会被不同的起始编码污染,而且没有遍历所有COL_A的逻辑。所以核心改动要做到两点:
- 把路径列表改成函数内部的局部变量,每次调用都独立初始化
- 遍历所有COL_A的唯一编码,逐个生成路径并存入字典
重构后的代码实现
首先,我们重新写一个递归函数,让它返回单个起始编码的完整路径列表,不再依赖全局变量:
import pandas as pd def get_full_path(df, start_num): # 初始化当前编码的路径列表 path = [] # 获取当前编码对应的所有COL_B节点 next_nodes = df[df['COL_A'] == start_num]['COL_B'].tolist() for node in next_nodes: path.append(node) # 递归获取子节点的路径,拼接到当前路径后 child_path = get_full_path(df, node) path.extend(child_path) return path # 批量生成字典的主逻辑 def generate_path_dict(df): # 获取所有COL_A的唯一编码 all_col_a = df['COL_A'].unique() path_dict = {} for code in all_col_a: path_dict[code] = get_full_path(df, code) return path_dict
代码说明
get_full_path函数:- 每次调用都新建局部变量
path,避免不同起始编码的路径互相干扰 - 先获取当前编码对应的所有COL_B节点,逐个添加到路径
- 对每个子节点递归调用自身,把返回的子路径拼接到当前路径后
- 当某个节点没有后续子节点(即
next_nodes为空),递归终止,返回当前路径
- 每次调用都新建局部变量
generate_path_dict函数:- 提取DataFrame中所有不重复的COL_A编码
- 遍历每个编码,调用
get_full_path获取路径,存入字典 - 最后返回完整的路径字典
测试示例
比如我们构造一个测试用的DataFrame:
# 测试数据 data = { 'COL_A': ['B1011', 'B1011', 'B1012', 'B1014', 'B1013'], 'COL_B': ['B1012', 'B1013', 'B1014', 'B1018', 'B2017'] } df = pd.DataFrame(data) # 生成路径字典 result = generate_path_dict(df) print(result)
输出会是:
{ 'B1011': ['B1012', 'B1014', 'B1018', 'B1013', 'B2017'], 'B1012': ['B1014', 'B1018'], 'B1014': ['B1018'], 'B1013': ['B2017'] }
完全符合你想要的格式。
额外优化提示
如果你的DataFrame数据量很大,递归可能会碰到栈溢出的问题,这时候可以把递归改成迭代方式,比如用栈来模拟递归过程:
def get_full_path_iterative(df, start_num): path = [] stack = [start_num] while stack: current = stack.pop() next_nodes = df[df['COL_A'] == current]['COL_B'].tolist() # 反转一下,保证顺序和递归一致 for node in reversed(next_nodes): path.append(node) stack.append(node) return path
把generate_path_dict里的get_full_path换成这个迭代版本就可以了,性能更稳定。
内容的提问来源于stack exchange,提问作者jovicbg
相关产品推荐
相关产品推荐

