熊猫groupby并将行转换为列

时间:2020-02-03 04:33:52

标签: python pandas dataframe pandas-groupby

我的销售数据集如下: 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

谢谢。

2 个答案:

答案 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