移至主內容
首頁
SLAT Blogs

主導覽

  • 首頁
使用者帳號選單
  • 登入

導航連結

  1. 首頁
  2. 部落格
  3. 肥貓的異想世界

Excel做不太到的事:能列出各細項目的樞紐分析表

By 肥貓 , 30 八月, 2026

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出現兩次之類的資料。但是姑且不論技術面,這樣看起來好像眼睛會更花,反倒「以繁馭簡」了。讓我再想想...

Blog tags
Python
  • 肥貓的異想世界

部落格列表

管理日誌
LibreOffice 正體中文文件
肥貓的異想世界
軟體自由運動部落格
馬哥的大小事
My Libre World
社會派宅爸

最新文章

Excel做不太到的事:能列出各細項目的樞紐分析表
二十年後,ODF 依然是辦公文件唯一真正的開放標準,也是政府唯一能信任的標準
代表 ODF 向大家致謝
[機搜] Claude Code 兩種瀏覽器自動化模式的比較
[機翻][節錄] Ubuntu 終於對 Deb 套件表達了一些尊重
川普會成為希律王與加略人猶大嗎?
試取得地理資訊系統中各路段的高度表
續1:用QGIS處理有斷點的資料的示範--以杭溫高速鐵路溫州北站附近為例(OpenStreetMap)
用QGIS處理有斷點的資料的示範--以杭溫高速鐵路溫州北站附近為例(OpenStreetMap)
用Python/QGIS篩選地理資料的簡短示範
我的 2025 回顧
LibreOffice x GSoC 2025 成果報告
Powered by Drupal