在pandas数据帧中向前移动一个月的列值

时间:2017-06-28 13:20:58

标签: python pandas dataframe time-series

有没有办法在pandas数据帧中向前移动一列的值? (请注意,我想要更新列值而不是日期值)。 例如,如果我有:

           ColumnA   ColumnB
2016-10-01       1  0
2016-09-30       2  1
2016-09-29       5  1
2016-09-28       7  1
.
.
2016-09-01       3  1
2016-08-31       4  7
2016-08-30       4  7
2016-08-29       9  7
2016-08-28       10  7

然后我希望能够在ColumnB中移动值  提前一个月,以获得所需的输出:

           ColumnA   ColumnB
2016-10-01       1  1
2016-09-30       2  7
2016-09-29       5  7
2016-09-28       7  7
.
.
2016-09-01       3  7
2016-08-31       3  X
2016-08-30       4  X
2016-08-29       9  x
2016-08-28       10  x

在我拥有的数据中,每个月固定的值(例如,9月份ColumnB中的值为1),因此每月的天数有点不同这一事实应该不成问题。

这似乎与Python/Pandas - DataFrame Index - Move one month forward相关,但在链接的问题中,OP想要移动整个帧,我想只移动选定的列。

2 个答案:

答案 0 :(得分:2)

它不是太优雅,但你可以这样做:

df=df.reset_index()
df['index']=pd.to_datetime(df['index'],infer_datetime_format=True)
df['offset']=df['index']-pd.DateOffset(months=1)
res=df.merge(df,right_on='index',left_on='offset',how='left')

并从res中获取您想要的列

答案 1 :(得分:1)

您可以先为每个月创建一个新的pandas Periods索引,然后找到每个月的值并使用pandas自动索引对齐来创建一个新列。

df1 = df.copy()
orig_idx = df.index
df1.index = orig_idx.to_period('M')
col_b_new = df1.groupby(level=0)['ColumnB'].first().tshift(1)
df1['ColumnB_new'] = col_b_new
df1.index = orig_idx

输出

            ColumnA  ColumnB  ColumnB_new
2016-10-01        1        0          1.0
2016-09-30        2        1          7.0
2016-09-29        5        1          7.0
2016-09-28        7        1          7.0
2016-09-01        3        1          7.0
2016-08-31        4        7          NaN
2016-08-30        4        7          NaN
2016-08-29        9        7          NaN
2016-08-28       10        7          NaN