如何在pandas DataFrame中添加条件计数器生成对应分组编号
实现方案
直接用pandas原生的掩码和位移操作即可完成,无需循环,核心逻辑代码如下:
import pandas as pd # 构造示例DataFrame data = { 'id': [3,3,3,3,3,3,5,5,5], 'date': ['04/09/2019','30/10/2019','03/05/2020','05/09/2020','31/10/2020','03/11/2020','03/09/2019','27/10/2019','02/05/2020'], 'notify': ['no','yes','no','no','yes','no','no','yes','no'] } df = pd.DataFrame(data) # 核心实现逻辑 ## 1. 给所有notify为yes的行生成全局递增的分组编号 mask_yes = df['notify'] == 'yes' df.loc[mask_yes, 'time_group'] = mask_yes.cumsum() ## 2. 仅给yes行紧邻的下一行no填充对应编号 mask_fill = (df['notify'] == 'no') & (df['notify'].shift(1) == 'yes') df.loc[mask_fill, 'time_group'] = df['time_group'].shift(1).loc[mask_fill] # 可选:如果需要把NaN转为空字符串,执行下行代码 # df['time_group'] = df['time_group'].fillna('').astype(str) print(df)
逻辑说明
- 第一步通过
cumsum()对所有notify=yes的行计数,天然生成全局递增的分组编号,符合编号规则 - 第二步用你提到的
shift(1)获取上一行的notify值和分组编号,仅对yes行紧邻的下一行no做填充,其余行保持空值,完全匹配预期输出 - 全程无循环操作,处理百万行级数据也不会有性能问题
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

