如何基于日期列按分组将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
相关产品推荐
相关产品推荐

