pandas 队列的时间序列(上一年)的滞后值

pandas lagged value of time series (previous year) for cohort

对于数据帧:

import pandas as pd

df = pd.DataFrame({
    'dt':[
        '2019-01-01',
        '2019-01-02',
        '2019-01-03',
        '2020-01-01',
        '2020-01-02',
        '2020-01-03',
        '2019-01-01',
        '2019-01-02',
        '2019-01-03',
        '2020-01-01',
        '2020-01-02',
        '2020-01-03'
    ],
    'foo': [1,2,3, 4,5,6, 1,5,3, 4,10,6],

    'category': [1,1,1,1,1,1,  2,2,2,2,2,2]
})

如何找到每个类别上一年的滞后值?

df['dt'] = pd.to_datetime(df['dt'])
display(df)

仅移动索引 returns 一个空结果,因此分配失败。

df['last_year'] = df[df.dt == df.dt - pd.offsets.Day(365)]

显然,连接 2019 年月份和日期的数据是可行的 - 但看起来相当麻烦。有没有更好的方法?

编辑

想要的结果:

dt  foo     category  last_year
2020-01-01  4   1      1
2020-01-02  5   1      2
2020-01-03  6   1      3
2020-01-01  4   2      1
2020-01-02  10  2      5
2020-01-03  6   2      3

你可以 merge 在你 assign 列 dt 之后用它自己 df 与你想要的不同 pd.DateOffset.

print (df.merge(df.assign(dt=lambda x: x['dt']+pd.DateOffset(years=1)), 
                on=['dt', 'category'], 
                suffixes=('','_lastYear'), 
                how='left'))
           dt  foo  category  foo_lastYear
0  2019-01-01    1         1           NaN
1  2019-01-02    2         1           NaN
2  2019-01-03    3         1           NaN
3  2020-01-01    4         1           1.0
4  2020-01-02    5         1           2.0
5  2020-01-03    6         1           3.0
6  2019-01-01    1         2           NaN
7  2019-01-02    5         2           NaN
8  2019-01-03    3         2           NaN
9  2020-01-01    4         2           1.0
10 2020-01-02   10         2           5.0
11 2020-01-03    6         2           3.0