如何在Python DataFrame中实现类Vlookup链式查询并生成结果DataFrame
实现DataFrame类Vlookup链式查询并去重
需求说明
要在DataFrame里做类似Vlookup的链式查询,最终输出到新的DataFrame中。仅需要关注两列a和b,这两列的数值存在对应关联关系。
示例数据
import pandas as pd data = {'a': [111, 112, 113, 114, 115, 215, 214, 213, 212, 211], 'b': [112, 113, 114, 115, 116, 214, 213, 212, 211, 210]} df = pd.DataFrame(data)
查询规则
- 起始点选择:必须是同时出现在列
a和列b中的值,比如示例里的115、215 - 链式查询逻辑:拿起始值去
b列找匹配项,找到后取对应行的a列值;再用这个新值继续去b列查找,直到无法找到为止,形成一条完整的链 - 去重要求:子链需排除,比如114作为起始点的链(114、113、112)是115起始链的子集,不能算作独立链
期望输出
new_df = pd.DataFrame({ 'found': [112, 113, 114, 115, 214, 213, 212, 211], 'iteration': [1, 1, 1, 1, 2, 2, 2, 2] })
现有代码问题
你提供的代码存在变量未定义(如starting_values、result)的问题,且未处理子链去重逻辑,无法输出正确结果。
可行方案
核心思路
- 构建
b到a的映射字典,提升查询效率 - 筛选所有符合条件的起始值(同时存在于
a和b中的值) - 对每个起始值生成完整链,用集合记录已处理值避免子链重复
- 将所有有效链整理为目标DataFrame
完整可运行代码
import pandas as pd # 初始化数据 data = {'a': [111, 112, 113, 114, 115, 215, 214, 213, 212, 211], 'b': [112, 113, 114, 115, 116, 214, 213, 212, 211, 210]} df = pd.DataFrame(data) # 构建b到a的映射(若b列有重复值,默认取第一个,可按需调整) b_to_a = df.set_index('b')['a'].to_dict() # 筛选所有符合条件的起始值:同时在a和b中出现的值 start_candidates = set(df['a']) & set(df['b']) visited = set() # 记录已处理值,防止子链重复 result_list = [] iteration_num = 1 for start_val in start_candidates: if start_val in visited: continue current_chain = [] current_val = start_val # 遍历生成完整链 while current_val in b_to_a and current_val not in visited: visited.add(current_val) current_chain.append(current_val) current_val = b_to_a[current_val] # 将当前链加入结果列表 if current_chain: result_list.extend([(val, iteration_num) for val in current_chain]) iteration_num += 1 # 生成目标DataFrame并调整顺序匹配示例输出 new_df = pd.DataFrame(result_list, columns=['found', 'iteration']) new_df['found'] = new_df.groupby('iteration')['found'].transform(lambda x: x[::-1]) new_df = new_df.sort_values(['iteration', 'found']).reset_index(drop=True) print(new_df)
代码说明
b_to_a字典:将b列值作为键,对应a列值作为值,实现O(1)时间复杂度的快速查询visited集合:记录所有已处理过的值,无论作为起始点还是链中节点,都直接跳过,彻底避免子链重复- 链式遍历:从起始值开始,沿着
b→a的映射一直遍历,直到无法找到下一个值为止 - 最后两行用于调整链的顺序以匹配示例输出,若不需要该顺序可直接删除
内容的提问来源于stack exchange,提问作者8ull53y3
相关产品推荐
相关产品推荐

