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

如何按ID组循环处理DataFrame,计算行日期差并标记状态?

问题需求

现有如下结构的DataFrame:

iddate
a20-01-2020
a22-03-2020
a15-03-2020
b05-02-2019
b09-05-2019

需完成以下操作:

  • 按id分组,每组除首行外的每一行,计算当前行date与前一行date的天数差值
  • 若差值<30或>56,在该行的status列填入"no"
  • 若差值在30至56之间,在该行的status列填入"yes"
  • 首行status列留空

最终需输出如下结构的DataFrame:

iddatestatus
a20-01-2020
a20-03-2020yes
a15-04-2020no
b05-02-2019
b09-05-2019no

解决方案

使用Pandas可以高效完成该任务,代码实现如下:

import pandas as pd

# 构造初始数据
df = pd.DataFrame({
    'id': ['a', 'a', 'a', 'b', 'b'],
    'date': ['20-01-2020', '22-03-2020', '15-03-2020', '05-02-2019', '09-05-2019']
})

# 转换日期格式为datetime类型(匹配日-月-年的输入格式)
df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y')

# 按id分组后对日期排序,保证每组内时间顺序正确
df = df.sort_values(by=['id', 'date']).reset_index(drop=True)

# 计算每组内相邻日期的天数差
df['date_diff'] = df.groupby('id')['date'].diff().dt.days

# 根据差值区间设置status列
df['status'] = pd.cut(
    df['date_diff'],
    bins=[-float('inf'), 30, 56, float('inf')],
    labels=['no', 'yes', 'no']
)

# 填充首行空值,删除临时计算列
df['status'] = df['status'].fillna('')
df = df.drop(columns=['date_diff'])

# 输出结果
print(df)

关键步骤说明

  1. 日期类型转换:将字符串日期转为Pandas可处理的datetime类型,确保后续能正确计算日期差。
  2. 分组排序:初始数据中部分组的日期是乱序的,排序后才能保证相邻行是时间上的前后关系。
  3. 日期差计算:通过groupby+diff实现组内相邻日期的差值计算,提取天数用于判断。
  4. 区间映射:用pd.cut将差值映射到对应的"yes"/"no"标签,首行因无前置数据差值为NaN,填充为空字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:36:29