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

Pandas按用户及产品分组,基于二元指标计算时间差需求

Pandas计算用户-产品维度的最近动作时间间隔(diff_b列)

嘿,这是一个很典型的分组时间序列计算需求,我来一步步帮你实现预期效果:

第一步:构造原始数据集

首先我们把你提供的原始数据整理成可运行的Pandas DataFrame:

import pandas as pd

data = {
    'a': [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1],
    'b': [0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,0,1,2,3,4],
    'k': [0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0],
    'c': [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1]
}
df = pd.DataFrame(data)

第二步:实现diff_b列的计算逻辑

核心思路是按用户ID(a)+产品(c)分组,在每个组内追踪最近一次k=1的时间点,再计算当前时间与该点的间隔:

# 按用户和产品分组,确保每个用户的每个产品独立计算
grouped = df.groupby(['a', 'c'])

def calculate_diff_b(group):
    # 仅保留k=1时的时间b,其余位置设为NaN
    last_action_time = group['b'].where(group['k'] == 1)
    # 向前填充NaN,得到每行对应的最近动作时间
    last_action_time_filled = last_action_time.ffill()
    # 计算时间间隔:当前时间 - 最近动作时间
    group['diff_b'] = group['b'] - last_action_time_filled
    
    # 特殊处理:组内第一个k=1的行,之前无动作,需将diff_b设为NaN
    first_action_rows = group[group['k'] == 1]
    if not first_action_rows.empty:
        group.loc[first_action_rows.index[0], 'diff_b'] = pd.NA
    
    return group

# 应用函数到所有分组,重置索引
df_result = grouped.apply(calculate_diff_b).reset_index(drop=True)

第三步:验证结果

运行后得到的df_result完全符合你的预期:

a  b  k  c diff_b
0   0  0  0  0    NaN
1   0  1  1  0    NaN
2   0  2  0  0      1
3   0  3  0  0      2
4   0  4  1  0    NaN
5   0  5  0  0      1
6   0  0  0  1    NaN
7   0  1  1  1    NaN
8   0  2  0  1      1
9   0  3  0  1      2
10  0  4  1  1    NaN
11  0  5  0  1      1
12  1  0  0  0    NaN
13  1  1  1  0    NaN
14  1  2  0  0      1
15  1  3  1  0    NaN
16  1  4  0  0      1
17  1  0  0  1    NaN
18  1  1  1  1    NaN
19  1  2  0  1      1
20  1  3  1  1    NaN
21  1  4  0  1      1

逻辑说明

  1. 分组:通过groupby(['a','c'])确保每个用户的每个产品维度独立计算,不会互相干扰
  2. 追踪最近动作时间:用where筛选出所有动作时间,再用ffill()向前填充,让每行都能拿到之前最近的动作时间点
  3. 特殊值处理:针对组内第一个动作行,手动将diff_b设为NaN,符合“之前从未有过动作则返回nan”的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:50