按用户计算相邻数据点时间差及绘制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
相关产品推荐
相关产品推荐

