如何在pandas中另一列满足条件时重置diff()计算的日期间隔计数
解决方案
原有代码的问题是仅按id单维度分组,没有识别reset_day = Y触发的重置边界,所以无法中断计数。你可以通过给每个id内部划分重置块的方式实现需求,具体实现代码如下:
import pandas as pd import numpy as np # 1. 预处理:先转换日期格式,再按id+日期升序排序,保证同id的记录按时间顺序排列 example['date'] = pd.to_datetime(example['date'], format='%Y/%m/%d') example = example.sort_values(by=['id', 'date']).reset_index(drop=True) # 2. 生成每个id内部的重置块标识:遇到reset_day='Y'时块号+1,同一块内的记录连续计算间隔 example['reset_block'] = example.groupby('id')['reset_day'].transform(lambda x: (x == 'Y').cumsum()) # 3. 按id+重置块双重分组计算日期间隔,填充首行NaN为0即可 example['test tdelta'] = example.groupby(['id', 'reset_block'])['date'].diff() / np.timedelta64(1, 'D') example['test tdelta'] = example['test tdelta'].fillna(0) # 不需要保留中间标识列可执行以下代码删除 # example = example.drop('reset_block', axis=1)
计算逻辑和你的需求完全匹配:每个reset_day = Y的行都会作为新块的第一行,diff结果为NaN,填充0后和你预设的tdelta值一致;同一块内后续的行会和块内上一行的日期计算间隔,遇到新的Y时自动重置。
如果需要直接填充原tdelta列的缺失值,直接将计算出的test tdelta赋值给tdelta列即可。
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

