我的销售数据集如下: df1
district item Year salesAmount
Arba pen 2019 10
Arba pen 2019 20
Arba pencil 2018 30
Arba pencil 2018 30
Arba pencil 2019 30
Cebu pen 2019 100
Cebu pen 2019 300
Cebu pen 2018 100
Cebu pen 2018 100
Cebu pen 2019 100
Cebu laptop 2019 20000
Cebu laptop 2018 20000
Cebu fruit 2019 200
Cebu fruit 2018 800
Cebu fruit 2019 800
Cebu fruit 2018 100
我可以完成groupby并分别获得2018年和2019年每个产品的汇总金额。
result = df1.groupby(['district', 'item', 'Year'], as_index=False)['salesAmount'].sum()
但是我想按如下所示的表格列进行列的进一步转换
预期输出:
district item 2018_sales 2019_sales
Arba pen 0 30
Arba pencil 60 30
Cebu pen 500 200
Cebu laptop 20000 20000
Cebu fuit 900 1000
谢谢。
答案 0 :(得分:6)
鉴于您先前对result
的计算,只需使用数据透视表和一些额外的格式化步骤对其进行扩展。请注意,aggfunc
的默认pivot_table
是'mean'
,但是鉴于这些值已经在上一步中进行了汇总,因此如果您更喜欢使用{{1 }}。
np.sum
当然,您也可以忘记开头的result = (
result
.pivot_table(index=['district', 'item'], columns=['Year'], values='salesAmount', fill_value=0)
.add_suffix('_sales')
.reset_index()
)
result.columns.name = None
>>> result
district item 2018_sales 2019_sales
0 Arba pen 0.0 30.0
1 Arba pencil 60.0 30.0
2 Cebu fruit 900.0 1000.0
3 Cebu laptop 20000.0 20000.0
4 Cebu pen 200.0 500.0
,而直接执行groupby
:
pivot_table
答案 1 :(得分:1)
您可以使用数据透视表
df.pivot_table(values='salesAmount', index=['district', 'item'], columns=['Year'], aggfunc=np.sum)
Year 2018 2019
district item
Arba pen NaN 30.0
pencil 60.0 30.0
Cebu fruit 900.0 1000.0
laptop 20000.0 20000.0
pen 200.0 500.0