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

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

查询规则

  1. 起始点选择:必须是同时出现在列a和列b中的值,比如示例里的115、215
  2. 链式查询逻辑:拿起始值去b列找匹配项,找到后取对应行的a列值;再用这个新值继续去b列查找,直到无法找到为止,形成一条完整的链
  3. 去重要求:子链需排除,比如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)的问题,且未处理子链去重逻辑,无法输出正确结果。

可行方案

核心思路

  1. 构建b到a的映射字典,提升查询效率
  2. 筛选所有符合条件的起始值(同时存在于a和b中的值)
  3. 对每个起始值生成完整链,用集合记录已处理值避免子链重复
  4. 将所有有效链整理为目标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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:32:38