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

如何使用pandas的shift函数在dataframe中计算next_day和prior_day列

pandas实现方案(基于shift函数)

核心逻辑:先将数据转为「日期为行、prev_day为列」的透视表,通过对行和列分别做shift操作,即可快速匹配到目标值,再合并回原表即可完成需求。

实现步骤

  • 第一步:预处理DATE字段,转为datetime类型支持日期运算
  • 第二步:构造透视表,行索引为DATE,列索引为prev_day,值为price
  • 第三步:对透视表分别做行和列的shift操作,得到next_day和prior_day的映射表
  • 第四步:将映射表转为长表后和原表合并,得到最终结果

完整可运行代码

import pandas as pd

# 构造测试数据
data = {
    'DATE': ['01-01-2018', '02-01-2018', '02-01-2018', '03-01-2018', '03-01-2018', '03-01-2018'],
    'prev_day': [1, 1, 2, 1, 2, 3],
    'price': [44, 45, 41, 54, 49, 46]
}
df = pd.DataFrame(data)

# 1. 转DATE为日期类型
df['DATE'] = pd.to_datetime(df['DATE'], format='%d-%m-%Y')

# 2. 构造透视表
pivot = df.pivot(index='DATE', columns='prev_day', values='price')

# 3. shift计算映射表
## next_day:取DATE+1天、prev_day+1对应的price
next_pivot = pivot.shift(periods=-1, axis=0).shift(periods=-1, axis=1)
## prior_day:取DATE-1天、prev_day-1对应的price
prior_pivot = pivot.shift(periods=1, axis=0).shift(periods=1, axis=1)

# 4. 转长表合并回原表
next_df = next_pivot.reset_index().melt(id_vars='DATE', value_name='next_day')
prior_df = prior_pivot.reset_index().melt(id_vars='DATE', value_name='prior_day')
df = df.merge(next_df, on=['DATE', 'prev_day'], how='left')
df = df.merge(prior_df, on=['DATE', 'prev_day'], how='left')

# 可选:DATE转回原字符串格式,空值替换为空字符串
df['DATE'] = df['DATE'].dt.strftime('%d-%m-%Y')
df = df.fillna('')

print(df)

运行结果

DATE  prev_day  price next_day prior_day
0  01-01-2018         1     44       41          
1  02-01-2018         1     45       49          
2  02-01-2018         2     41       46        44
3  03-01-2018         1     54                 
4  03-01-2018         2     49                  45
5  03-01-2018         3     46                  41

内容的提问来源于stack exchange,提问作者Murilo Barbosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:39:02