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

如何基于日期列按分组将Pandas的Cpr1列值向前偏移一个月

问题描述

现有名为df_actual的DataFrame,数据结构示例如下:

BondSecurity TradeCoupon IssuanceYear    AsOfDate      Cpr1
0      FNCL        4.0          2017      2022-06-30    17.888957
1      FNCL        4.0          2018      2022-04-30    26.383609
2      FNCL        4.0          2018      2022-05-31    20.834899
3      FNCL        4.0          2018      2022-06-30    17.707935
4      FNCL        4.0          2019      2022-04-30    28.453986
... ... ... ... ... ...
16230   G2SF       4.0          2017       2020-05-31   30.848600
16231   G2SF       4.0          2017       2020-06-30   38.159500
16232   G2SF       4.0          2018       2020-04-30   39.266900
16233   G2SF       4.0          2018       2020-05-31   40.343300
16234   G2SF       4.0          2018       2020-06-30   48.352200

需求:仅将Cpr1列的值向前偏移一个月(即当前日期行的Cpr1替换为同一分组内下一个月日期行的Cpr1,例如2022-04-30行的Cpr1取2022-05-31行的20.834899),其余列保持不变;需按BondSecurity、TradeCoupon、IssuanceYear分组执行该偏移操作。

解决方案

通过Pandas的分组结合偏移方法即可实现,具体代码如下:

import pandas as pd

# 确保AsOfDate列为日期格式,保证排序正确性
df_actual['AsOfDate'] = pd.to_datetime(df_actual['AsOfDate'])

# 按指定字段分组,先对每组数据按日期升序排序,再将Cpr1列向上偏移1位
df_actual['Cpr1'] = df_actual.groupby(['BondSecurity', 'TradeCoupon', 'IssuanceYear']) \
                            .apply(lambda group: group.sort_values('AsOfDate')['Cpr1'].shift(-1)) \
                            .reset_index(drop=True)

代码说明

  • pd.to_datetime:转换日期格式,避免字符串排序导致的顺序错误
  • groupby(...):按要求的三个维度划分数据组
  • sort_values('AsOfDate'):每组内按日期升序排列,确保下一个月的数据在当前行的下一行
  • shift(-1):将Cpr1列的值向上偏移一行,实现"当前行取下一行值"的需求
  • reset_index(drop=True):重置索引,保证偏移后的数据能和原DataFrame的行一一匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:50:24