簡體   English   中英

Pandas pivot表格多層排序

[英]Pandas pivot Table Multi-Layer Sorting

我給了df:(更新):

import pandas as pd
import numpy as np
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                         "bar", "bar", "bar", "bar","zz","zz"],
                  "B": ["one", "one", "one", "two", "two",
                         "one", "one", "two", "two","xy","zz"],
                   "Name":["Peter", "Amy", "Brian", "Amy", "Amy",
                         "Peter", "Brian", "Peter", "Brian","Brian","Brian"],
                  "Year": [2019, 2019, 2019, 2019,
                         2019, 2019, 2020, 2020,
                          2020,2019,2020],
                  "Values": [20, 4, 20, 5, 6, 6, 8, 9, 9,10,5]})
df_pivot = pd.pivot_table(df, values='Values', index=['Name','A', 'B'],
                    columns=['Year'], aggfunc=np.sum, fill_value=0, margins=True, margins_name="Totals")

一旦我以我喜歡的方式 pivot 它看起來像這樣:

 Year            2019  2020  Totals
Name   A   B                      
Amy    foo one     4     0       4
           two    11     0      11
Brian  bar one     0     8       8
           two     0     9       9
       foo one    20     0      20
       zz  xy     10     0      10
           zz      0     5       5
Peter  bar one     6     0       6
           two     0     9       9
       foo one    20     0      20
Totals            71    31     102

現在“有趣”的部分開始了。

我希望這個 df pivot 表根據值的總和從左到右對所有索引列進行排序。

讓我解釋。

首先,我想按每個名稱的“總計”的降序按“名稱”列對 pivot 表進行排序,因此我將計算 Amy = 15、Brian = 52、Peter = 35 的總和。由此我知道第一列應該排序 Brian/Peter/Amy。

現在我對第二列“A”做同樣的事情,但第一列“名稱”是固定的。

即名稱 Brian(在頂部)我現在計算列“A”的總數(我想看看 foo/bar/zz 是否應該是第一個),因此我計算出 Brian-Foo 等於 20 和 Brian-bar等於 8+9 並且 Brian-zz 是 15,因此我們希望在第二列中首先為 Brian 設置 Foo ......對於 rest 索引列也是如此。

output 應如下所示:

Year            2019  2020  Totals
Name   A   B                      
Brian  foo one    20     0      20 
       bar two     0     9       9
           one     0     8       8
       zz  xy     10     0      10
           zz      0     5       5
Peter  foo one    20     0      20
       bar two     0     9       9
           one     6     0       6
Amy    foo two    11     0      11
           one     4     0       4
Totals            71    31     102

長話短說,首先我想根據該列中項目的總數對第一列進行排序並且我想修復它,然后我想對該列中的項目進行排序,但按照第一次排序等進行分組。

你能建議如何做到這一點嗎? 我非常感謝幫助!

謝謝帕維爾

您可以使用groupby.transform獲取名稱中的總和,然后對其進行排序:

df_pivot = (df_pivot.iloc[:-1]
              .assign(sort=lambda x: x['Totals'].groupby(level=0).transform('sum'))
              .sort_values(['sort','Name','Totals'], 
                           ascending=[False,True,False], kind='mergesort')
              .drop('sort', axis=1)
              .append(df_pivot.iloc[-1])
           )

Output:

Year            2019  2020  Totals
Name   A   B                      
Brian  foo one    20     0      20
       bar two     0     9       9
           one     0     8       8
Peter  foo one    20     0      20
       bar two     0     9       9
           one     6     0       6
Amy    foo two    11     0      11
           one     4     0       4
Totals            61    26      87

暫無
暫無

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

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