如何基于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
相关产品推荐
相关产品推荐

