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

按用户计算相邻数据点时间差及绘制CDF的技术问题

问题:计算用户相邻活动时间差并生成目标DataFrame

原始DataFrame

import pandas as pd

df = pd.DataFrame(
    {'user_id': [53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54], 
     'timestamp': [10, 15, 20, 25, 30, 31, 34, 37, 14, 16, 18, 20, 22, 25, 28], 
     'activity': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
                  'D', 'D', 'D', 'D', 'D', 'D', 'D']}
)

输出如下:

user_id  timestamp activity
0        53         10        A
1        53         15        A
2        53         20        A
3        53         25        A
4        53         30        A
5        53         31        A
6        53         34        A
7        53         37        A
8        54         14        D
9        54         16        D
10       54         18        D
11       54         20        D
12       54         22        D
13       54         25        D
14       54         28        D

期望目标结果

需要计算每个user_id下相邻数据点的时间差,首次活动时间差设为0,最终得到如下DataFrame:

user_id  timestamp activity  timestamp_diff
0        53         10        A             0.0
1        53         15        A             5.0
2        53         20        A             5.0
3        53         25        A             5.0
4        53         30        A             5.0
5        53         31        A             1.0
6        53         34        A             3.0
7        53         37        A             3.0
8        54         14        D             0.0
9        54         16        D             2.0
10       54         18        D             2.0
11       54         20        D             2.0
12       54         22        D             2.0
13       54         25        D             3.0
14       54         28        D             3.0

用户尝试的代码及问题

用户尝试通过多次shift计算时间差,但结果不符合预期:

df['shift1'] = df.groupby('user_id')['timestamp'].shift(1, fill_value=0)
df['shift2'] = df.groupby('user_id')['timestamp'].shift(-1, fill_value=0)

df['diff1'] = df.timestamp - df.shift1
df['diff2'] = df.shift2 - df.timestamp

df['shift3'] = df.groupby('user_id')['timestamp'].shift(-1)
df['shift3'].fillna(method='ffill', inplace=True)
df['diff3'] = df.shift3 - df.timestamp

运行后生成的diff1、diff2、diff3均与目标的timestamp_diff不匹配,无法得到正确结果。

解决方案

直接使用pandas的diff()方法对分组后的timestamp列计算相邻差值,再将首行的NaN填充为0即可:

# 按user_id分组,计算timestamp的相邻差值
df['timestamp_diff'] = df.groupby('user_id')['timestamp'].diff()
# 将首行的NaN替换为0(首次活动时间差设为0)
df['timestamp_diff'] = df['timestamp_diff'].fillna(0)

执行后即可得到与目标一致的timestamp_diff列。

代码解释

  • groupby('user_id')['timestamp'].diff():对每个用户的时间戳序列计算当前行与上一行的差值,每个用户的首行因没有上一行数据会生成NaN。
  • fillna(0):将每个用户首行的NaN替换为0,符合题目中“首次活动时间差为0”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:01:05