按时间戳将DataFrame从长转宽,关联用户历史数据
问题描述
现有如下结构的DataFrame(还包含更多用户相关信息列):
time user 2019-10-01 00:00:05 UTC 1 2019-10-01 00:00:22 UTC 1 2019-10-01 00:00:23 UTC 2 2019-10-01 00:00:35 UTC 2
需要为每行添加对应用户的历史行数据,预期结果如下(示例仅添加1条历史数据):
time user time_past_1 2019-10-01 00:00:05 UTC 1 NA 2019-10-01 00:00:22 UTC 1 2019-10-01 00:00:05 UTC 2019-10-01 00:00:23 UTC 2 NA 2019-10-01 00:00:35 UTC 2 2019-10-01 00:00:23 UTC
要求方法支持添加任意数量的历史行数据,且不能用逐行遍历的低效方式,此前尝试透视表和long_to_wide未找到适配方案。
高效解决方案
可以利用pandas的groupby结合shift方法实现,这是针对分组数据的向量化操作,完全避免逐行遍历,效率适配大数据量场景:
1. 添加单条历史数据
import pandas as pd # 假设原DataFrame名为df df['time_past_1'] = df.groupby('user')['time'].shift(1)
2. 批量添加任意数量的历史数据
如果需要添加N条历史数据(比如N=3),可以通过循环批量生成对应列:
num_past = 3 # 自定义需要添加的历史数据条数 for i in range(1, num_past + 1): # 生成time列的历史数据 df[f'time_past_{i}'] = df.groupby('user')['time'].shift(i) # 若需要同步生成其他用户相关列的历史数据,例如列名为'user_col': # df[f'user_col_past_{i}'] = df.groupby('user')['user_col'].shift(i)
关键说明
groupby('user')确保仅在同一用户的数据组内偏移,不会跨用户提取历史数据shift(n)将组内数据向下偏移n位,组内前n行自动填充NaN,完全匹配需求- 操作全程为向量化计算,速度远高于逐行遍历,适合处理大规模DataFrame
内容的提问来源于stack exchange,提问作者Slug
相关产品推荐
相关产品推荐

