如何在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'] = ''
代码细节解释
- 标记非零行:
is_non_zero列用来区分需要计算间隔的行 - 分组处理日期:
x['date'].where(x['is_non_zero']):只保留非零行的日期,其他行设为NaN.ffill():用前一个非零日期填充后续的NaN行,这样diff()就能拿到上一个非零日期.diff().dt.days:计算相邻日期的间隔天数,转成整数
- 修正首个非零值:每个分组里第一个非零值的
diff结果是NaN,我们手动改成0 - 清空零值行:把原本是零值的行的
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
相关产品推荐
相关产品推荐

