Python 如何将group by sum结果分配给Pandas中的新列

Python 如何将group by sum结果分配给Pandas中的新列,python,pandas,Python,Pandas,使用样本数据: Calendar SKU Quantity 2017-10-01 1001 10 2017-10-01 1002 20 2017-10-01 1003 30 2017-11-01 1001 40 2017-11-01 1002 50 2017-11-01 1003 60 2018-11-01 1001 70 2018-11-01 1002 80 2018-03-01 1001 9

使用样本数据:

Calendar    SKU   Quantity
2017-10-01  1001     10 
2017-10-01  1002     20
2017-10-01  1003     30
2017-11-01  1001     40
2017-11-01  1002     50
2017-11-01  1003     60
2018-11-01  1001     70
2018-11-01  1002     80
2018-03-01  1001     90
我希望在不改变当前数据结构的情况下,为2017年和2018年的数量总和创建两列,如下所示:

预期结果

 Calendar    SKU    Quantity  Year_2017_Quantity   Year_2018_Quantity
2017-10-01   1001      10           50                    160
2017-10-01   1002      20           70                     80  
2017-10-01   1003      30           90                      0
2017-11-01   1001      40           50                    160
2017-11-01   1002      50           70                     80
2017-11-01   1003      60           90                      0
2018-11-01   1001      70           50                    160
2018-11-01   1002      80           70                     80
2018-03-01   1001      90           50                    160
2017年数量和2018年数量列都是按SKU和各自日历年分组的求和运算的结果


谢谢。

我们在这里使用透视图,我使用的是
交叉表
然后是
合并

s=pd.crosstab(df.SKU,df.Calendar.dt.year,df.Quantity,aggfunc='sum').fillna(0).add_prefix('Year_Quantity_').reset_index()
df=df.merge(s,how='left')
    Calendar   SKU  Quantity  Year_Quantity_2017  Year_Quantity_2018
0 2017-10-01  1001        10                50.0               160.0
1 2017-10-01  1002        20                70.0                80.0
2 2017-10-01  1003        30                90.0                 0.0
3 2017-11-01  1001        40                50.0               160.0
4 2017-11-01  1002        50                70.0                80.0
5 2017-11-01  1003        60                90.0                 0.0
6 2018-11-01  1001        70                50.0               160.0
7 2018-11-01  1002        80                70.0                80.0
8 2018-03-01  1001        90                50.0               160.0

您可以使用
groubpy
merge

df['Calendar']= pd.to_datetime(df['Calendar'])
df_sum = df.groupby([df['Calendar'].dt.year, 'SKU']).sum().unstack(0)
df_sum.columns = [f'Year_{j}_{i}' for i, j in df_sum.columns]
df_out = df.merge(df_sum.fillna(0), on='SKU', right_index=True).sort_index()

df_out 
输出:

    Calendar   SKU  Quantity  Year_2017_Quantity  Year_2018_Quantity
0 2017-10-01  1001        10                50.0               160.0
1 2017-10-01  1002        20                70.0                80.0
2 2017-10-01  1003        30                90.0                 0.0
3 2017-11-01  1001        40                50.0               160.0
4 2017-11-01  1002        50                70.0                80.0
5 2017-11-01  1003        60                90.0                 0.0
6 2018-11-01  1001        70                50.0               160.0
7 2018-11-01  1002        80                70.0                80.0
8 2018-03-01  1001        90                50.0               160.0

您是否尝试过类似于
.groupby().sum()
pd.merge