Pandas条件匹配时复制上一行另一列值的实现方法
Pandas按条件新增marker列实现方案
规则说明
需要新增marker列,填充规则如下:
- 当行同时满足两个条件:①
event列取值不为0;②该行上方(当前行之前的所有行)存在input1列值为5的记录时,marker取上一行label列的值 - 其余不满足条件的行,
marker取值为0
实现代码
采用向量化运算实现,无逐行循环,性能适配各类数据规模场景:
import pandas as pd # 构造原始数据集 df = pd.DataFrame( [ [0, 0, 0, 0, 0], [5, 5, 0, 0, 2], [5, 5, 0, 0, 2], [0, 0, 0, 24, 0], [0, 0, 0, 0, 0], [5, 0, 5, 0, 3], [5, 0, 5, 0, 3], [5, 0, 5, 0, 3], [0, 0, 0, 25, 0], [0, 0, 0, 0, 0] ], columns=['input1', 'input2', 'input3', 'event', 'label'] ) # 核心处理逻辑 # 标记:截止到上一行,是否出现过input1=5的记录 has_previous_input5 = (df['input1'] == 5).cumsum().shift(1, fill_value=0) > 0 # 拼接筛选条件 fill_condition = (df['event'] != 0) & has_previous_input5 # 按规则赋值,不满足条件填0 df['marker'] = df['label'].shift(1).where(fill_condition, 0).astype(int)
处理结果
执行代码后输出的结果与预期完全一致:
input1 input2 input3 event label marker 0 0 0 0 0 0 0 1 5 5 0 0 2 0 2 5 5 0 0 2 0 3 0 0 0 24 0 2 4 0 0 0 0 0 0 5 5 0 5 0 3 0 6 5 0 5 0 3 0 7 5 0 5 0 3 0 8 0 0 0 25 0 3 9 0 0 0 0 0 0
逻辑说明:用
cumsum()累计input1=5的出现次数,移位1行后即可得到每行之前是否出现过符合要求的input1记录,再结合event非0的条件筛选需要填充的行,直接取移位后的label列赋值即可,执行效率高。
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

