[英]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.