如何使用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
相关产品推荐
相关产品推荐

