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
逻辑说明
- 分组:通过
groupby(['a','c'])确保每个用户的每个产品维度独立计算,不会互相干扰 - 追踪最近动作时间:用
where筛选出所有动作时间,再用ffill()向前填充,让每行都能拿到之前最近的动作时间点 - 特殊值处理:针对组内第一个动作行,手动将
diff_b设为NaN,符合“之前从未有过动作则返回nan”的要求
内容的提问来源于stack exchange,提问作者Eleanor
相关产品推荐
相关产品推荐

