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
?