如何使用Python Pandas按id分组从重置点反向计算日期天数差
解决思路
核心逻辑是给每一行匹配到后方最近的reset="Y"对应的日期作为基准日,规则如下:
- 若当前行是
reset="Y",负向差固定为0 - 若当前行是
reset="N",负向差为当前日期减去后方最近的reset="Y"日期的天数 - 若后方没有
reset="Y"记录,负向差固定为0
修正后代码
import pandas as pd import numpy as np df = pd.DataFrame({'reset':['N','Y','N','N','N','Y','N'], 'date':['2019-09-04','2020-12-06','2020-12-06','2019-09-07','2019-11-08','2021-05-21','2021-06-23'], 'id':[16860,16860,16860,16860,16860,16860,16860] }) # 修正日期转换格式,和实际日期分隔符匹配 df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d') df = df.sort_values(['id','date']).reset_index(drop=True) # 保留原有正确的分组逻辑 df['group'] = df['reset'].replace({'N':False,'Y':True}) df['group'] = df.groupby('id')['group'].cumsum() # 生成基准日列:reset=Y行填充自身日期,其余为空,按id向后填充最近的基准日 df['base_date'] = df.apply(lambda x: x['date'] if x['reset'] == 'Y' else pd.NaT, axis=1) df['base_date'] = df.groupby('id')['base_date'].fillna(method='bfill') # 计算负向天数差 df['negative difference'] = df.apply( lambda x: 0 if x['reset'] == 'Y' or pd.isna(x['base_date']) else (x['date'] - x['base_date']).days, axis=1 ) # 删除临时基准列 df = df.drop('base_date', axis=1) print(df)
输出结果
reset date id group negative difference 0 N 2019-09-04 16860 0.0 -459 1 N 2019-09-07 16860 0.0 -456 2 N 2019-11-08 16860 0.0 -394 3 Y 2020-12-06 16860 1.0 0 4 N 2020-12-06 16860 1.0 -166 5 Y 2021-05-21 16860 2.0 0 6 N 2021-06-23 16860 2.0 0
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

