簡體   English   中英

熊貓分組並將行轉換為列

[英]pandas groupby and convert rows to columns

我有如下銷售數據集: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()

但我想有一個表格列如下 inroder 做進一步的列轉換

預期輸出:

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

謝謝。

鑒於您之前對result計算,只需使用數據透視表和一些額外的格式化步驟來擴展它。 請注意,默認aggfuncpivot_table'mean' ,但考慮到這些值已在上一步中聚集也不會,如果你喜歡使用有所作為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

result = (
    df1
    .pivot_table(
        index=['district', 'item'], 
        columns=['Year'], 
        values='salesAmount', 
        fill_value=0,
        aggfunc='sum'
    )
    .add_suffix('_sales')
    .reset_index()
)

您可以使用數據透視表

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM