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

按时间戳将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:11:07