如何在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)
期望输出如下:
解决方案
实现步骤
- 转换日期格式:将
Date列转为datetime类型,便于计算日期差。 - 分组处理:按
ID分组,对每组内的日期进行迭代判断。 - 标记目标行:初始化起始日期,遍历后续日期,当日期差超过阈值时,标记该行并更新起始日期。
代码实现
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
相关产品推荐
相关产品推荐

