计算 pandas 数据框数月的总和

Calculating summation over months of pandas dataframe

我有下面给出的 pandas 数据框:

ID       Year       R1  R1_f
KAR1    20201001    1   5
KAR1    20201101    2   6
KAR1    20201201    3   7
KAR1    20210101    4   8
KAR1    20210201    5   9
KAR1    20210301    6   10
KAR1    20210401    7   11
KAR1    20210501    8   12
KAR1    20210601    9   13
KAR1    20210701    10  14
KAR1    20210801    11  15
KAR1    20210901    12  16
KAR2    20201001    4   9
KAR2    20201101    3   8
KAR2    20201201    2   7
KAR2    20210101    1   6
KAR2    20210201    9   5
KAR2    20210301    2   4
KAR2    20210401    6   3
KAR2    20210501    5   2
KAR2    20210601    3   1
KAR2    20210701    30  2
KAR2    20210801    34  3
KAR2    20210901    20  4

我需要按如下所示转换上面的数据框:

ID Year      R1_sum 3m_R1 6m_R1 9m_R1 12m_R1 R1_f 3m_R1_f 6m_R1_f 9m_R1_f 12m_R1_f 

KAR1 20210901 12 33 57 72 78 16 45 81 108 126 KAR2 20210901 20 84 98 110 119 4 9 15 30 54

在上面的输出数据框中 R1_sum 两个 ID 的值都等于 20210901 年的值。

3m_R1 是列 R1

的 3 个月 20210901 到 20210701 的值的总和

6m_R1 是 R1

列从 20210901 到 20210401 的 6 个月的值的总和

9m_R1是R1

列从20210901到20210101这9个月的值的总和

12m_R1 是列 R1

从 20210901 到 20201001 的 12 个月的值的总和 对于两个 ID,

R1_f 的值等于 20210901 年的值。

3m_R1_f 是 R1_f

列 20210901 到 20210701 3 个月的值的总和

6m_R1_f是R1_f

列从20210901到20210401这6个月的值的总和

9m_R1_f是R1_f

列从20210901到20210101这9个月的值的总和

12m_R1_f是R1_f

列从20210901到20201001这12个月的值的总和

请帮忙

每组从上个月到前几个月的计数 ID 第一个箱子助手组 GroupBy.cumcount and aggregate sum, then aggregate sum with GroupBy.cumsum, reshape by DataFrame.unstack, flatten MultiIndex in columns and add to DataFrame created by GroupBy.last:

数据:

df = pd.DataFrame({'ID': ['KAR1', 'KAR1', 'KAR1', 'KAR1', 'KAR1', 'KAR1', 'KAR1', 
                          'KAR1', 'KAR1', 'KAR1', 'KAR1', 'KAR1', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2', 'KAR2'], 
                   'Year': [20201001, 20201101, 20201201, 20210101, 20210201, 20210301,
                            20210401, 20210501, 20210601, 20210701, 20210801, 20210901, 
                            20201001, 20201101, 20201201, 20210101, 20210201, 20210301,
                            20210401, 20210501, 20210601, 20210701, 20210801, 20210901], 
                   'R1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 4, 3, 2, 1, 9, 2, 6, 5, 3, 30, 34, 20], 
                   'R1_f': [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4]})
    
print (df)

cols = ['R1','R1_f']
g = df.groupby('ID').cumcount(ascending=False) // 3
df1 = df.groupby(['ID',g])[cols].sum().groupby(level=0).cumsum().unstack()
print (df1)
      R1               R1_f              
       0   1    2    3    0   1    2    3
ID                                       
KAR1  33  57   72   78   45  81  108  126
KAR2  84  98  110  119    9  15   30   54

df2 = df.groupby('ID')[['Year'] + cols].last()
df2.columns = pd.MultiIndex.from_product([df2.columns, [-1]])
print (df2)
            -1  -1   -1
ID                     
KAR1  20210901  12   16
KAR2  20210901  20    4

df = df2.join(df1).sort_index(axis=1)
df.columns = [f'{(b + 1) * 3}m_{a}' if b!=-1 else f'{a}_sum' for a, b in df.columns]
df = df.reset_index()
df.insert(1, 'Year', df.pop('Year_sum'))
print (df)
     ID      Year  R1_sum  3m_R1  6m_R1  9m_R1  12m_R1  R1_f_sum  3m_R1_f  \
0  KAR1  20210901      12     33     57     72      78        16       45   
1  KAR2  20210901      20     84     98    110     119         4        9   

   6m_R1_f  9m_R1_f  12m_R1_f  
0       81      108       126  
1       15       30        54