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

如何在Python中使用diff()按ID分组计算Pandas DataFrame的上一个有效值间隔天数?

问题:按ID分组计算非零值的日期间隔天数

先看你给出的原始DataFrame:

ID date       value
0  10 2022-01-01 100
1  10 2022-01-02 150
2  10 2022-01-03 0
3  10 2022-01-04 0
4  10 2022-01-05 200
5  10 2022-01-06 0
6  10 2022-01-07 150
7  10 2022-01-08 0
8  10 2022-01-09 0
9  10 2022-01-10 0
10 10 2022-01-11 0
11 10 2022-01-12 100
12 23 2022-02-01 490
13 23 2022-02-02 0
14 23 2022-02-03 350
15 23 2022-02-04 333
16 23 2022-02-05 0
17 23 2022-02-06 0
18 23 2022-02-07 0
19 23 2022-02-08 211
20 23 2022-02-09 100

你的需求很明确:

  • 新增days_last_value列,记录当前非零value与上一个非零value的日期间隔天数
  • 每个ID的首个非零值对应days_last_value为0
  • 零值对应的该列留空
  • 计算需要按ID分组进行,且要用diff()方法实现

解决方案

我来给你一步步实现这个需求,完全用Pandas的方法搞定:

步骤1:确保日期列是datetime类型

首先得把date列转换成时间格式,不然没法计算日期间隔:

import pandas as pd

# 假设你的DataFrame叫df
df['date'] = pd.to_datetime(df['date'])

步骤2:分组计算非零值的日期间隔

核心思路是:先筛选每个分组里的非零值行,对这些行的日期用diff()计算间隔,再把结果映射回原DataFrame,零值行留空。直接上代码:

# 先标记出非零值的行
df['is_non_zero'] = df['value'] != 0

# 按ID分组,计算非零值日期的间隔
df['days_last_value'] = df.groupby('ID').apply(
    lambda x: x['date'].where(x['is_non_zero']).ffill().diff().dt.days
).reset_index(level=0, drop=True)

# 修正每个ID的首个非零值为0,零值行设为空
df.loc[df.groupby('ID')['is_non_zero'].cumsum() == 1, 'days_last_value'] = 0
df.loc[~df['is_non_zero'], 'days_last_value'] = ''

代码细节解释

  1. 标记非零行:is_non_zero列用来区分需要计算间隔的行
  2. 分组处理日期:
    • x['date'].where(x['is_non_zero']):只保留非零行的日期,其他行设为NaN
    • .ffill():用前一个非零日期填充后续的NaN行,这样diff()就能拿到上一个非零日期
    • .diff().dt.days:计算相邻日期的间隔天数,转成整数
  3. 修正首个非零值:每个分组里第一个非零值的diff结果是NaN,我们手动改成0
  4. 清空零值行:把原本是零值的行的days_last_value设为空字符串

运行后得到的结果

完全符合你想要的输出:

ID date       value days_last_value
0  10 2022-01-01 100 0
1  10 2022-01-02 150 1
2  10 2022-01-03 0 
3  10 2022-01-04 0 
4  10 2022-01-05 200 3
5  10 2022-01-06 0 
6  10 2022-01-07 150 2
7  10 2022-01-08 0 
8  10 2022-01-09 0 
9  10 2022-01-10 0 
10 10 2022-01-11 0 
11 10 2022-01-12 100 5
12 23 2022-02-01 490 0
13 23 2022-02-02 0 
14 23 2022-02-03 350 2
15 23 2022-02-04 333 1
16 23 2022-02-05 0 
17 23 2022-02-06 0 
18 23 2022-02-07 0 
19 23 2022-02-08 211 4
20 23 2022-02-09 100 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:42:49