Microsoft Excel的樞紐分析表是業界殺手級的應用,因為能很方便地聚合成千上萬筆的資料。但是,該表的功能是提供統計報表,要深到資料的細節就顯得捉襟見肘。
例如我們有張資料表(如下圖)
資料產生語法:
df = pd.DataFrame(
{
"客戶": ["張三", "張三", "張三", "張三", "張三", "李四", "李四", "李四", "李四"],
"品項": ["牛奶", "牛奶", "牛奶", "豆漿", "豆漿", "牛奶", "牛奶", "豆漿", "豆漿"],
"大小": ["小杯","大杯","大杯","小杯","小杯","大杯","小杯","小杯","大杯"],
"杯數": [1, 3, 2, 3, 7, 4, 5, 6, 7],
"費時": [2, 4, 5, 5, 6, 6, 8, 9, 9],
}
)

用Excel的樞紐分析表,可以做出值的總和、次數分配表(Frequency Table)、平均值、最大值、最小值等等。但是遇到其他統計量如中位數(median)、眾數(mode)似乎束手無策,遇到較離散的資料弱點立現。
Pandas稍微好一點,至少官方文件寫到內建的參數有:"sum","min", "max", "mean",善用Pandas語法的話,大部分統計量應該也不是問題。
但是當我純粹只想依欄位聚合資料,不想看到被「洗過」的資料時,以上功能就不甚實用了。我繞了很多彎去查,最後發現其實只要這樣寫就可以了:
table4 = pd.pivot_table(
df, values="杯數", index=["客戶", "品項"], columns=["大小"], aggfunc=list
)
這作法會把該交叉表遇到的值全給列出來,就像這樣:

但倘若您不想看到眼花,只想看到每個唯獨值(類似pd.unique())的時候,則可:
table3 = pd.pivot_table(
df, values="杯數", index=["客戶", "品項"], columns=["大小"], aggfunc=lambda x: sorted(x.unique().tolist())#, fill_value=0
)
前註文寫說aggfunc=pd.unique()似乎也可以。但是我這邊不知為何報錯率偏高,所以我就沒用了。跑出來會長這樣:

有趣的是,Google AI引註給我的網頁,其實沒有明寫是用那些語法,顯見AI消化知識的能力。上述網頁都還是我為了引註方便,循線、輾轉細查之後才發現的。但若不假思索就複製貼上,要查證該語法來源的難度也變高,也是另一個風險。
展望:
其實我有想過,是否可以在裡面每一格,又再變出次數分配表。例如第一排第四格裡面,3出現1次、4出現兩次之類的資料。但是姑且不論技術面,這樣看起來好像眼睛會更花,反倒「以繁馭簡」了。讓我再想想...