有没有办法在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想要移动整个帧,我想只移动选定的列。
答案 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