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

Pandas实现类似Excel Vlookup的行外Key值存在性校验

判断DataFrame当前行Key是否在后续行存在并设置Flag

需求说明

检查DataFrame中当前行的Key值是否在其下方的所有行中存在,存在则给Flag字段设为Y,不存在则设为N。

示例数据

import pandas as pd

data = {"Key": ['AB001', 'AB002', 'AB003', 'AB004', 'AB001', 'AB005', 'AB005', 'AB001'],
        "SprintNo": [1, 1, 1, 1, 2, 2, 3, 3]}
df = pd.DataFrame(data)

期望输出

Key  SprintNo Flag
0  AB001         1    Y
1  AB002         1    N
2  AB003         1    N
3  AB004         1    N
4  AB001         2    Y
5  AB005         2    Y
6  AB005         3    N
7  AB001         3    N

解决方案

方法一:高效累积计数法(适合大数据量)

# 反转Key列后按分组累积计数,判断是否有后续出现
df['Flag'] = df['Key'][::-1].groupby(df['Key']).cumcount().gt(0).map({True: 'Y', False: 'N'})

逻辑解释:

  1. 把Key列反转,从最后一行开始向前处理;
  2. 按Key分组后用cumcount()计数,反转后每个Key的首次出现(对应原表最后一次出现)计数为0,之后的位置计数递增;
  3. gt(0)判断计数是否大于0,大于0就说明原表中当前行下方还有该Key;
  4. 最后用map把布尔值转成Y/N标记。

方法二:基于最后出现位置的判断(逻辑更直观)

# 获取每个Key在原表中最后一次出现的索引
last_occur_idx = df['Key'].iloc[::-1].drop_duplicates().index

# 逐行比较当前索引是否小于该Key最后出现的索引
df['Flag'] = df.apply(lambda row: 'Y' if row.name < last_occur_idx[row['Key']] else 'N', axis=1)

逻辑解释:

  1. 反转DataFrame后去重,得到每个Key最后一次出现的索引位置;
  2. 对每行来说,如果当前行的索引小于该Key最后出现的索引,说明后面还有该Key,标记Y,否则标记N。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:07:51