获取不同行的列值比率

Get ratio of column values for different rows

我有一个这样的 pandas 数据框:

Date Route Col1 Col2
01/01/2020 A 99 26
01/02/2020 A 37 96
01/03/2020 A 20 83
01/01/2021 A 50 79
01/02/2021 A 16 50
01/03/2021 A 52 33
01/01/2020 B 48 44
01/02/2020 B 96 30
01/03/2020 B 17 42
01/01/2021 B 34 74
01/02/2021 B 49 37
01/03/2021 B 70 12

我需要根据 2020 年和 2021 年的值获取 Col1 和 Col2 的比率。也就是说,每个月都有一个新列 Col2/Col1.

我尝试了几种方法(pct_change,差异),但我无法获得正确的结果。我还制作了一个 DateTimeIndex 来帮助我解决这个问题,但无法获得比率。

这是我正在尝试做的事情的要点,但不确定如何在这种情况下构建 .loc 命令:

df['Col1_ratio'] = df['Col2'] / df.loc(<get index of previous year's row>)['Col1']

这是预期的输出数据帧:

Date Route Col1 Col2 Col1_ratio Col2_ratio
01/01/2020 A 99 26 NA NA
01/02/2020 A 37 96 NA NA
01/03/2020 A 20 83 NA NA
01/01/2021 A 50 79 0.505050505 3.038461538
01/02/2021 A 16 50 0.432432432 0.520833333
01/03/2021 A 52 33 2.6 0.397590361
01/01/2020 B 48 44 NA NA
01/02/2020 B 96 30 NA NA
01/03/2020 B 17 42 NA NA
01/01/2021 B 34 74 0.708333333 1.681818182
01/02/2021 B 49 37 0.510416667 1.233333333
01/03/2021 B 70 12 4.117647059 0.285714286

例如Col1_ratio 是 Col1_JAN21 / Col1_JAN20,依此类推。

想法是创建 MultiIndex 然后在 rename 中为日期时间添加一年,划分列并添加后缀 DataFrame.add_suffix, last add to original by DataFrame.join:

df1 = df.set_index(['Date','Route'])

df2 = df1.rename(lambda x: x + pd.offsets.DateOffset(years=1), level=0)

df3 = df1[['Col1','Col2']].div(df2[['Col1','Col2']]).add_suffix('_ratio')

df = df.join(df3, on=['Date','Route'])
print (df)
         Date Route  Col1  Col2  Col1_ratio  Col2_ratio
0  2020-01-01     A    99    26         NaN         NaN
1  2020-01-02     A    37    96         NaN         NaN
2  2020-01-03     A    20    83         NaN         NaN
3  2021-01-01     A    50    79    0.505051    3.038462
4  2021-01-02     A    16    50    0.432432    0.520833
5  2021-01-03     A    52    33    2.600000    0.397590
6  2020-01-01     B    48    44         NaN         NaN
7  2020-01-02     B    96    30         NaN         NaN
8  2020-01-03     B    17    42         NaN         NaN
9  2021-01-01     B    34    74    0.708333    1.681818
10 2021-01-02     B    49    37    0.510417    1.233333
11 2021-01-03     B    70    12    4.117647    0.285714