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

如何基于Pandas数据框与指定列表实现搜索分组算法?

看起来你需要把这些节点按它们最终流向的终止节点分组,然后提取对应关联边对吧?我给你整理了一个清晰的实现方案,用图遍历的思路就能搞定,比单纯的搜索树更适配你这个存在多节点汇聚的场景:

核心思路

你的需求本质是有向图的「终止节点溯源分组」:每个节点会沿着边的方向最终到达一个没有出边的终止节点(比如示例里的C和O),所有最终流向同一个终止节点的节点属于同一组,对应的所有边就是该组的结果。


步骤1:构建图结构并缓存每个节点的最终终止节点

首先我们把DataFrame转换成便于遍历的图结构,然后用递归+缓存的方式快速找到每个节点最终的终止节点(避免重复计算):

import pandas as pd
from collections import defaultdict

# 先初始化你的示例数据
df = pd.DataFrame({
    'To': ['A', 'B', 'D', 'L', 'M', 'N'],
    'From': ['B', 'C', 'C', 'M', 'N', 'O']
})
L = ['A', 'B', 'C', 'D', 'L', 'M', 'N', 'O']

# 构建出边字典:key是起点(To列),value是下一个节点(From列)
out_edges = df.set_index('To')['From'].to_dict()

# 缓存每个节点的最终终止节点,避免重复遍历
terminal_cache = {}

def find_terminal(node):
    # 已经计算过的直接返回缓存
    if node in terminal_cache:
        return terminal_cache[node]
    # 如果节点没有出边,它自己就是终止节点
    if node not in out_edges:
        terminal_cache[node] = node
        return node
    # 递归找下一个节点的终止节点
    next_node = out_edges[node]
    terminal = find_terminal(next_node)
    terminal_cache[node] = terminal
    return terminal

# 提前计算列表L中所有节点的终止节点
for node in L:
    find_terminal(node)

步骤2:根据终止节点分组并提取对应边

现在所有节点都有了对应的终止节点,我们可以按终止节点把节点分组,然后提取该组所有节点作为起点的边:

# 按终止节点分组所有节点
node_groups = defaultdict(list)
for node in L:
    node_groups[terminal_cache[node]].append(node)

# 定义搜索函数:输入节点返回对应的分组边
def get_group_edges(target_node):
    # 获取目标节点的最终终止节点
    terminal = terminal_cache[target_node]
    # 获取该终止节点对应的所有组内节点
    group_nodes = node_groups[terminal]
    # 筛选出所有起点在组内的边
    return df[df['To'].isin(group_nodes)]

# 测试搜索'A'的结果,和你的示例完全一致
print(get_group_edges('A'))
# 输出:
#   To From
# 0  A    B
# 1  B    C
# 2  D    C

为什么不推荐用搜索树?

你提到想实现搜索树,但这个场景里存在多节点指向同一节点的情况(比如B和D都指向C),属于有向图结构而非严格的树结构。用图遍历+缓存的方式能更高效地处理这种分支合并的情况,避免重复计算,而且逻辑更贴合你的分组需求。


内容的提问来源于stack exchange,提问作者MaxB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:26:47