You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中按序列号计算至下一次事件发生的剩余天数

需求说明

现有如下结构的DataFrame:

SerialnrDateEvent occured
110.01.220
105.02.220
112.02.221
120.04.220
127.04.220
101.05.220
105.05.221
210.01.220
205.02.220
212.02.221
220.04.220
227.04.220
201.05.220
205.05.221

需要为每个Serialnr分组的每一行,计算距离下一次Event occured为1的剩余天数,生成名为Days_to_event的列,最终效果如下:

SerialnrDateEvent occuredDays_to_event
110.01.22033
105.02.2207
112.02.22182
120.04.22015
127.04.2208
101.05.2204
105.05.221NaN
210.01.22033
205.02.2207
212.02.22182
220.04.22015
227.04.2208
201.05.2204
205.05.221NaN

解决方案代码

使用Pandas实现,核心逻辑是按序列号分组后,为每行匹配后续最近的事件日期并计算天数差:

import pandas as pd

# 构造原始数据(如果已有DataFrame可跳过此步)
data = {
    'Serialnr': [1,1,1,1,1,1,1,2,2,2,2,2,2,2],
    'Date': ['10.01.22','05.02.22','12.02.22','20.04.22','27.04.22','01.05.22','05.05.22',
             '10.01.22','05.02.22','12.02.22','20.04.22','27.04.22','01.05.22','05.05.22'],
    'Event occured': [0,0,1,0,0,0,1,0,0,1,0,0,0,1]
}
df = pd.DataFrame(data)

# 将日期列转换为datetime类型,确保能计算天数差
df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%y')

# 定义分组处理函数
def calculate_days_to_event(group):
    # 提取当前组内所有事件发生的日期并排序
    event_dates = group[group['Event occured'] == 1]['Date'].sort_values().tolist()
    
    # 为每行日期计算到下一个事件的天数
    def get_next_event_days(date):
        # 筛选出晚于当前日期的事件日期,取第一个
        next_event = [d for d in event_dates if d > date]
        if next_event:
            return (next_event[0] - date).days
        # 没有后续事件时返回NaN(可根据需求改为0或其他值)
        return pd.NA
    
    group['Days_to_event'] = group['Date'].apply(get_next_event_days)
    return group

# 按Serialnr分组处理数据
df = df.groupby('Serialnr', group_keys=False).apply(calculate_days_to_event)

# 打印结果
print(df)

结果说明
  • 非事件行:计算到最近的下一次事件的天数差
  • 组内最后一个事件行:因后续无更多事件,Days_to_event设为NaN,可根据业务需求修改为0或其他标记值

内容的提问来源于stack exchange,提问作者lis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:12:34