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'})
逻辑解释:
- 把
Key列反转,从最后一行开始向前处理; - 按
Key分组后用cumcount()计数,反转后每个Key的首次出现(对应原表最后一次出现)计数为0,之后的位置计数递增; gt(0)判断计数是否大于0,大于0就说明原表中当前行下方还有该Key;- 最后用
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)
逻辑解释:
- 反转DataFrame后去重,得到每个Key最后一次出现的索引位置;
- 对每行来说,如果当前行的索引小于该Key最后出现的索引,说明后面还有该Key,标记
Y,否则标记N。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

