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

如何在Pandas中按ID分组,实现按日期阈值的逐行比较与起始行重置?

问题背景

我有如下结构的表格:
表格结构

示例代码:

import pandas as pd
data = {
    'ID': [117, 117, 117, 117, 117, 117],
    'Date': ['2023-11-14', '2024-01-25', '2024-02-01', '2024-02-04', '2024-02-11', '2024-03-04']
}
df = pd.DataFrame(data)
需求描述

我需要实现:从每组首行开始,将其与后续行比较,直到日期差达到设定阈值(如30天);当该行满足阈值条件后,以该行作为新的起始行,继续与后续行比较。示例结果(阈值30天)如下:
示例结果

简言之,就是按ID分组后,每组内从首行开始对比后续行,达到阈值就重置起始行,重复这个逻辑。

尝试代码(未成功)
thres = 30

i = 0
control = True
for record in df['Date']:
    if record > thres:
            print(i, 'in position!', i)
        control = False
    i += 1
更新需求

我需要基于ID分组实现上述逻辑,示例数据如下:

import pandas as pd
data = {
    "ID": [117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118],
    "Date": ["2023-11-14", "2024-01-25", "2024-02-01", "2024-02-04", "2024-02-11", "2024-03-04",
             "2024-01-02", "2024-01-28", "2024-02-04", "2024-02-18", "2024-03-11", "2024-06-05"]
}

df = pd.DataFrame(data)

期望输出如下:
期望输出


解决方案

实现步骤

  1. 转换日期格式:将Date列转为datetime类型,便于计算日期差。
  2. 分组处理:按ID分组,对每组内的日期进行迭代判断。
  3. 标记目标行:初始化起始日期,遍历后续日期,当日期差超过阈值时,标记该行并更新起始日期。

代码实现

import pandas as pd

# 转换日期列为datetime类型
df['Date'] = pd.to_datetime(df['Date'])
threshold = 30

def mark_target_rows(group):
    # 初始化标记列表,首行默认标记为1
    marks = [1]
    start_date = group.iloc[0]['Date']
    
    for idx in range(1, len(group)):
        current_date = group.iloc[idx]['Date']
        # 计算当前日期与起始日期的天数差
        delta_days = (current_date - start_date).days
        if delta_days >= threshold:
            marks.append(1)
            start_date = current_date  # 更新起始日期为当前日期
        else:
            marks.append(0)
    group['Mark'] = marks
    return group

# 按ID分组应用处理函数
result_df = df.groupby('ID', group_keys=False).apply(mark_target_rows)
print(result_df)

输出结果

ID       Date  Mark
0   117 2023-11-14     1
1   117 2024-01-25     1
2   117 2024-02-01     0
3   117 2024-02-04     0
4   117 2024-02-11     0
5   117 2024-03-04     1
6   118 2024-01-02     1
7   118 2024-01-28     0
8   118 2024-02-04     1
9   118 2024-02-18     0
10  118 2024-03-11     1
11  118 2024-06-05     1

该结果与期望输出一致,每组内从起始行开始,当后续行与当前起始行的日期差≥30天时,标记该行并将其设为新的起始行,循环执行直到组内所有行处理完毕。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:17:17