代码之家  ›  专栏  ›  技术社区  ›  Miriam Farber

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

  •  4
  • Miriam Farber  · 技术社区  · 7 年前

    有没有办法将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
    

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

               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月份B列中的值是1),那么每个月的天数应该不会有什么问题。

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Binyamin Even    7 年前

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

    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')
    

    只需从你想要的专栏中选取

        2
  •  1
  •   Ted Petrou    7 年前

    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