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

如何在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

代码说明

  1. get_full_path函数:

    • 每次调用都新建局部变量path,避免不同起始编码的路径互相干扰
    • 先获取当前编码对应的所有COL_B节点,逐个添加到路径
    • 对每个子节点递归调用自身,把返回的子路径拼接到当前路径后
    • 当某个节点没有后续子节点(即next_nodes为空),递归终止,返回当前路径
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:22:54