pandas按多条件分组创建新列,基于日期差和new_id生成ns计数列
pandas 实现ns列计算方案
前置处理
首先保证两个前提:
- 把
Date列转换为pandas datetime格式,方便计算日期差 - 按
myid、Date升序排序,确保同一用户的行按时间顺序排列
实现逻辑
核心思路是把两个需要ns加1的触发条件拆解为布尔列,累加后加初始值1即可,无需创建多个冗余中间列:
- 条件1:同一myid分组内,当前行与前一行日期差大于30天
- 条件2:同一myid分组内,前一行的new_id不为空(对应规则中当前行new_id非空则下一行加1的要求)
两个条件满足任意一个就触发加1,累加后加上初始值1就是最终的ns值。
代码实现
import pandas as pd import numpy as np # 日期格式转换 df['Date'] = pd.to_datetime(df['Date'], format='%d-%b-%Y') # 按用户和日期排序,保证时间顺序正确 df = df.sort_values(['myid', 'Date']).reset_index(drop=True) def calc_ns(group): # 日期差超过30天的标记 cond1 = group['Date'].diff().dt.days > 30 # 前一行new_id非空的标记 cond2 = group['new_id'].shift().notna() # 累加触发计数+初始值1 group['ns'] = (cond1 | cond2).cumsum() + 1 return group # 按myid分组应用计算逻辑 df = df.groupby('myid', group_keys=False).apply(calc_ns)
结果说明
运行后输出结果和需求的期望逻辑完全匹配,排序步骤会自动修正原始数据中可能存在的日期顺序错误问题,避免日期差计算出错。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

