如何在Pandas中按ID分组:当Flag1为1时标记当前及后续11行
按分组生成flag2列的实现方案
核心处理逻辑
- 以
unique id为单位分组处理数据 - 每个分组的规则:
- 若该ID的记录行数不足12行,所有行的
flag2直接设为1 - 若行数≥12行,逐行判断:
- 当某行
flag1=0,且未被之前flag1=1的行覆盖后续11个月的标记,则flag2=0 - 当某行
flag1=1,当前行及后续11个月的flag2强制设为1,不受这段时间flag1的其他值影响
- 当某行
- 若该ID的记录行数不足12行,所有行的
Pandas实现代码
import pandas as pd def process_flag2(group): group = group.copy() row_count = len(group) group['flag2'] = 0 # 行数不足12的情况直接全设1 if row_count < 12: group['flag2'] = 1 return group # 初始化标记数组,记录需要设为1的行 mark_array = [False] * row_count for idx in range(row_count): if group['flag1'].iloc[idx] == 1: # 计算当前行往后11个月的结束位置,不超出总行数 end_pos = min(idx + 12, row_count) mark_array[idx:end_pos] = [True] * (end_pos - idx) # 将标记数组转为0/1数值 group['flag2'] = [1 if val else 0 for val in mark_array] return group # 假设你的数据集为df,且已按period排序 df = df.groupby('unique id').apply(process_flag2).reset_index(drop=True)
代码说明
process_flag2函数单独处理单个ID的分组数据,避免修改原数据集- 用布尔数组
mark_array批量标记目标行,比逐行修改效率更高 - 遍历中遇到
flag1=1时直接覆盖后续11行的标记,确保该规则优先级最高
内容的提问来源于stack exchange,提问作者Asit
相关产品推荐
相关产品推荐

