首页 > 解决方案 > 在 Pandas 中将多个每日价值列向前移动一年

问题描述

给定df如下数据框:

import pandas as pd
import numpy as np

np.random.seed(2021)
dates = pd.date_range('20130101', periods=720)
df = pd.DataFrame(np.random.randint(0, 100, size=(720, 3)), index=dates, columns=list('ABC'))
df

出去:

             A   B   C
2013-01-01  85  57   0
2013-01-02  94  86  44
2013-01-03  62  91  29
2013-01-04  21  93  24
2013-01-05  12  70  70
         ..  ..  ..
2014-12-17  38  42  20
2014-12-18  67  93  47
2014-12-19  27  10  74
2014-12-20  18  92  62
2014-12-21  90  40  31

我怎样才能将列B向前移动C一年?谢谢。请注意闰年问题。

下面的代码似乎适用于示例数据,但对于NaN内部带有 sB和的真实数据C,它会生成ValueError: cannot reindex from a duplicate axis

df[['B', 'C']] = df[['B', 'C']].shift(freq=pd.DateOffset(years=1))
print(df)

出去:

             A     B     C
2013-01-01  85   NaN   NaN
2013-01-02  94   NaN   NaN
2013-01-03  62   NaN   NaN
2013-01-04  21   NaN   NaN
2013-01-05  12   NaN   NaN
         ..   ...   ...
2014-12-17  38  33.0  79.0
2014-12-18  67  24.0  53.0
2014-12-19  27  54.0  39.0
2014-12-20  18  68.0  80.0
2014-12-21  90  65.0  65.0

标签: python-3.xpandasdataframenumpydatetime

解决方案


下面的代码似乎有效:

df[['B', 'C']] = df[['B', 'C']].shift(freq=pd.DateOffset(years=1))
print(df)

出去:

             A     B     C
2013-01-01  85   NaN   NaN
2013-01-02  94   NaN   NaN
2013-01-03  62   NaN   NaN
2013-01-04  21   NaN   NaN
2013-01-05  12   NaN   NaN
         ..   ...   ...
2014-12-17  38  33.0  79.0
2014-12-18  67  24.0  53.0
2014-12-19  27  54.0  39.0
2014-12-20  18  68.0  80.0
2014-12-21  90  65.0  65.0

推荐阅读