如何用Python實現透視表?

2020-12-15 CDA數據分析師

相信接觸過Excel的小夥伴都知道,Excel有一個非常強大的功能「數據透視表」,使用數據透視表可以自由選擇不同欄位,用不同的聚合函數進行匯總,並建立交叉表格,用以從不同層面觀察數據。這麼強大的功能,在Python中怎麼去實現呢?

不用擔心,Python的"數據分析小能手"Pandas很貼心地為我們提供了一個快速實現數據透視表功能的方法——pivot_table()。事不宜遲,讓我們趕緊看看如何在Python中實現數據透視表!

1. 數據

為幫助大家更好地理解,在講解如何使用pivot_table( )實現透視表前,我們先導入示例數據,在接下來的講解中都使用此數據作為例子。

# 導入示例數據

<<< data =pd.read_csv("data.csv")

<<< data.head()

月份 項目 部門 金額 剩餘金額

0 1月 水費 市場部 1962.37 8210.58

1 2月 水費 市場部 690.69 9510.60

2 2月 電費 市場部 2310.12 5384.92

3 2月 電費 運營部 -1962.37 7973.10

4 2月 電費 開發部 1322.33 6572.16

下面我將帶大家使用pivot_table( )一步一步實現數據透視表的操作。

2. 操作

首先,原數據有5個欄位,我們在做數據透視表之前必須理解每個欄位的意思,明確清楚自己需要得到什麼信息。

假設我們想看看不同月份所花費的水電費金額是多少,這時我們需要把欄位

「月份」

設置為索引,將欄位

「金額」

設置為我們需要看的值,具體代碼如下:

<<< data.pivot_table(index=['月份'],values=['金額'])

金額

月份

10月 3723.940000

11月 2900.151667

12月 10768.262857

1月 1962.370000

2月 1432.280000

3月 3212.106667

4月 4019.175000

5月 4051.480000

6月 6682.632500

7月 11336.463333

8月 17523.485000

9月 10431.960000

參數index為設置的索引列表,即分組依據,需要用中括號[ ]將索引欄位括起來;參數values為分組後進行計算的欄位列表,也需要用中括號[ ]括起來。這兩個參數的值可以是一個或多個欄位,即按照多個欄位進行分組和對多個欄位進行計算匯總。例如,設置index=['項目','部門']代表求不同

項目

不同

部門

下的金額。

<<< data.pivot_table(index=['項目','部門'],values=['金額'])

金額

項目 部門

水費 市場部 3614.318125

開發部 2358.205000

運營部 5896.213333

電費 市場部 6094.748235

開發部 1322.330000

運營部 7288.615000

採暖費 市場部 5068.380000

運營部 55978.000000

若設置values=['金額','剩餘金額'],即求不同

項目

不同

部門

金額

剩餘金額

的值。

<<< data.pivot_table(index=['項目','部門'],values=['金額','剩餘金額'])

剩餘金額 金額

項目 部門

水費 市場部 7478.423125 3614.318125

開發部 6866.490000 2358.205000

運營部 7224.033333 5896.213333

電費 市場部 7645.535882 6094.748235

開發部 6572.160000 1322.330000

運營部 8821.895000 7288.615000

採暖費 市場部 6572.030000 5068.380000

運營部 7908.560000 55978.000000

同時,如果我們想以交叉表的形式查看不同項目和不同部門下的消費金額,這時就要將欄位『部門』設置為列名,進行交叉查看,具體代碼如下:

<<< data.pivot_table(index=['項目'],columns=['部門'],values=['金額'])

金額

部門 市場部 開發部 運營部

項目

水費 3614.318125 2358.205 5896.213333

電費 6094.748235 1322.330 7288.615000

採暖費 5068.380000 NaN 55978.000000

通過上面的示例,我們可以看到某個分組下不存在記錄會被標記為NAN,例如上述中

採暖部

開發部

不存在

金額

這一欄位的記錄,則會標記為NAN。如果不希望被標記為NAN,我們可以通過設置參數fill_value=0來用數值0替代這部分的缺失值。

<<< data.pivot_table(index=['項目'],columns=['部門'],values=['金額'],fill_value=0)

金額

部門 市場部 開發部 運營部

項目

水費 3614.318125 2358.205 5896.213333

電費 6094.748235 1322.330 7288.615000

採暖費 5068.380000 0.000 55978.000000

在上面的示例中,我們都是默認分組後對值進行求平均值計算,假如我們想查看不同項目不同部門下金額的總和該怎麼實現呢?

通過設置參數aggfunc=np.sum即可對分組後的值進行求和操作,參數aggfunc代表分組後值的匯總方式,可傳入numpy庫中的聚合方法。

<<< data.pivot_table(index=['項目'],columns=['部門'],values=['金額'],fill_value=0,aggfunc=np.sum)

金額

部門 市場部 開發部 運營部

項目

水費 57829.09 4716.41 17688.64

電費 103610.72 1322.33 29154.46

採暖費 5068.38 0.00 55978.00

除了常見的求和、求平均值這兩種聚合方法,我們還可能接觸到以下這幾種:

與前面介紹的參數index,columns,value一樣,參數aggfunc傳入的值也是一個列表,表示可傳入一個或多個值。當傳入多個值時,表示對該值進行多種匯總方式,例如同時求不同項目不同部門下金額的求和值和平均值:

<<< data.pivot_table(index=['項目'],columns=['部門'],values=['金額'],fill_value=0,aggfunc=[np.sum,np.max])

sum amax

金額 金額

部門 市場部 開發部 運營部 市場部 開發部 運營部

項目

水費 57829.09 4716.41 17688.64 16807.58 2941.28 6273.56

電費 103610.72 1322.33 29154.46 18239.39 1322.33 26266.60

採暖費 5068.38 0.00 55978.00 5068.38 0.00 55978.00

同時,如果我們想對不同欄位進行不同的匯總方式,可通過對參數aggfunc傳入字典來實現,例如我們可以同時對不同

項目

不同

部門

下,對欄位

金額

求總和值,對欄位

剩餘金額

求平均值:

<<< data.pivot_table(index=['項目'],columns=['部門'],values=['金額','剩餘金額'],fill_value=0,aggfunc={'金額':np.sum,'剩餘金額':np.max})

剩餘金額 金額

部門 市場部 開發部 運營部 市場部 開發部 運營部

項目

水費 9510.60 8719.34 7810.38 57829.09 4716.41 17688.64

電費 9625.27 6572.16 9938.82 103610.72 1322.33 29154.46

採暖費 6572.03 0.00 7908.56 5068.38 0.00 55978.00

另外,在進行以上功能的同時,pivot_table還為我們提供了一個求所有行及所有列對應合計值的參數

margins

,當設置參數

margins=True

時,會在輸出結果的最後添加一行'All',表示根據

columns

進行分組後每一項的列總計值;以及在輸出結果的最後添加一列'All',表示根據

index

進行分組後每一項的行總計值。

<<< pd.set_option('precision',0)

<<< data.pivot_table(index=['項目'],columns=['部門'],values=['金額','剩餘金額'],fill_value=0,aggfunc={'金額':np.sum,'剩餘金額':np.max},margins=True)

剩餘金額 金額

部門 市場部 開發部 運營部 All 市場部 開發部 運營部 All

項目

水費 9511 8719 7810 9511 57829 4716 17689 80234

電費 9625 6572 9939 9939 103611 1322 29154 134088

採暖費 6572 0 7909 7909 5068 0 55978 61046

All 9625 8719 9939 9939 166508 6039 102821 275368

3. 番外

上面詳細介紹了如何在python中通過pivot_table( )方法實現數據透視表的功能,那麼,與數據透視表原理相同,顯示方式不同的『數據透視圖』又該怎麼實現呢?

實現方法非常簡單,將上述進行pivot_table操作後的對象進行實例化,再對實例化後的對象進行plot繪圖操作即可,具體代碼如下:

<<< df=data.pivot_table(index=['項目'],columns=['部門'],values='金額',fill_value=0)

<<< df.plot(kind='bar')

相關焦點

  • 如何實現數據透視表和數據透視圖的動態展示?試試插入日程表吧
    excel中的日程表和切片器的功能相似,可以按照時間的進度實現圖表的動態篩選,本文就以數據透視表、數據透視圖中日程表插入日程表,進行圖表的動態演示。如下圖所示,是表格的元數據,9個人在2019年1-6月的銷量表。要實現動圖所示的動態數據分析效果,該如何操作呢?
  • Excel 數據透視表的篩選欄位用過吧?如何將其布局改成橫向排列?
    我也是最近才知道,還有很多同學從來沒用過數據透視表的篩選功能,那可真是太可惜了。對於欄位很多的數據透視表來說,如果經常需要按條件篩選查看,使用篩選欄位會方便很多。而且篩選欄位還可以根據需要設置布局。今天就教大家如何將篩選欄位橫向排列。案例 :將下圖 1 的數據表製作成數據透視表,根據需要將其中部分欄位設置成篩選欄位,且橫行擺放。下圖 2 和 3 分別為兩種不同的橫排方法。
  • EXCEL怎麼製作數據透視表對數據進行分類統計?
    EXCEL2013怎麼製作數據透視表對數據進行分類統計?利用EXCEL的數據透視表功能,可以輕鬆實現對數據的分類匯總,這比用篩選或用公式的方法做要高效、快捷得多。下面通過一個例子給大家演示具體的操作方法利用EXCEL的數據透視表功能,可以輕鬆實現對數據的分類匯總,這比用篩選或用公式的方法做要高效、快捷得多。下面通過一個例子給大家演示具體的操作方法。1、假設我們有這樣一張表,需要統計每種水果的合計重量。2、首先,點擊「插入」選項卡,然後,點擊「數據透視表」3、在彈出的窗口中,選擇數據源列表。選擇放置數據透視表的位置。
  • Excel數據透視表怎麼做與如何統計各項所佔百分比和排序
    在 Excel 中,數據透視表主要用於分析統計,它與普通表的區別在於可任意組合欄位,從面方便分析統計各項數據。Excel數據透視表怎麼做?它有通常有兩種方法,一種是創建空數據透視表,另一種是創建統計好的數據透視表;其中前者需要自己統計,後者不用;一般來說,如果有符合要求的統計好的數據透視表,通常選擇它,這樣不必再統計。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    Mov 1-2在線編譯工具weblde使用之指南.mov 2-1如何在列表,字典,集合中根據條件.MOV 2-2 3 4命名 統計 字典.mov 2-5公共鍵.mov 2-6 如何讓字典保持有序.mov 2-7歷史記錄.mov 3-1 2迭代器.mov 3-3如何使用生成器函數實現迭代對象
  • 數據透視表怎麼做?超詳細教程來啦!
    什麼是數據透視表?數據透視表通常用於複雜的工作報告中,它是一個交互式表格,可以執行某些計算,例如求和和計數等。那我們應該如何創建數據透視表以及如何對其進行匯總呢?本文將為您提供有關製作數據透視表的詳細教程。
  • Excel條件格式、公式、透視表三種方法教你如何查找重複值!
    數據透視表數據透視表是我個人平日比較喜歡用的一個功能,查找重複數據十分方便。選中數據源,插入數據透視表,將需要查重列分別拖入「行」區域與「值」;將計數項降序處理,計數結果大於1地,表示數據有重複,再次利用篩選功能,篩選出大於1的結果即可。
  • Excel數據透視表怎麼做「數據分組統計」,原來這麼簡單
    而數據透視表更是我們可以不用加班的大功臣,合理的應用數據透視表,會讓工作事半功倍,那麼如何用Excel數據透視表做「數據分組統計」呢?內容雖然簡單,但是非常實用!員工所對應的銷售額情況,當然我只是摘取了表格的一個小部分,如果你的表格很多很多,你怎麼用數據透視表的方式做成:按照一個固定段位把數據進行一個分組,並且我們需要求的是,累計銷售額佔比.
  • 數據透視表一般操作步驟,記好了
    今天是數據透視表的第三篇教程。通過前幾篇文章,已經見證了數據透視表的神奇。我們來總結一下,數據透視表大概是分幾步操作完成的。2.插入透視。點擊【插入】,【數據透視表】。如下效果。你可以看到您選擇的數據源區域。也可以決定數據透視表放在哪裡。可以新工作表,或是現有工作表。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?
  • 如何用Python發送定時郵件?
    Python 發送定時郵件的小技巧 之前接了一個爬蟲的小項目,需要每天將數據發送到客戶的郵箱中,每天都登錄伺服器下載數據十分麻煩,因此就用 Python 配合 Windows 系統自帶的任務計劃,每天上午 10:00 定時將當天的數據發到客戶郵箱中。
  • Excel中迷你圖和數據透視表的具體運用
    你是否曾想過在excel單元格中插入圖表迷你圖能夠實現你的想法,它可以根據數據,在單元格內顯示數據的變化趨勢,原來的數據如圖所示具體操作如下:第一步:首先選中單元格,在「插入」選項卡中的「迷你圖」選項組中點擊你想要的類型的迷你圖,例如,我選擇折線圖
  • 如何利用python實現生命遊戲
    英國數學家約翰·何頓·康威在1970年發明了 the game of life,今天番茄加速就來分享下如何利用python實現生命遊戲,規則如下:每個細胞有兩種狀態 - 存活或死亡每個細胞與以自身為中心的周圍八格細胞產生互動當前細胞為存活狀態時
  • 「Excel技巧」利用數據透視表快速將一個匯總表拆分成多個工作表
    今天要說的是,如何根據某一列將一個Exce工作表拆分成多個工作表。舉慄子,以下這麼一份總表,需要按照班級將其拆分成多個單獨的表,一個班級為一個表。你會按照班級一個一個地篩選複製出來嗎?二、創建數據透視表全選表格,點擊【插入】—【數據透視表】,選擇放置數據透視表的位置在【新工作表】。
  • 擺脫了Excel重複做表,換個工具輕鬆實現報表自動化,漲薪三倍
    我是一個畢業兩年的90後,畢業後在一個主營糧食交易的企業工作,崗位的主要工作就是製作各類數據統計報表、臺帳、數據圖表等等,各類的日報,每天都要做一遍,此外還有什麼周報月報……之前在這個崗位的同事,每天至少要花好幾個小時去折騰Excel,用數據透視表、vlookup等等各類函數去做出一份有3000多個數據的日報。
  • 如何安裝python3
    如何安裝python3首先找到python的官網: https://www.python.org/然後點擊Download然後選擇對應的版本,這裡選擇的是windows>跳轉到對應的界面以後,選擇python3.5版本,64位下載即可下載完成以後有一個.exe的可執行文件雙擊這個可執行文件,然後進行選擇安裝。
  • 只會用Excel嗎?這套全面的數據分析工具打包送你,拿走不謝
    如何才能掌握數據分析能力,最重要的兩點就是工具和思維,這篇先來說說數據分析工具。數據分析工具大體可以分成三類,第一類Excel,第二類是數據分析軟體,比如tableau、FineBI等等,第三類就是程式語言python、R。PS:本文中工具的下載地址及數據分析學習資料都已整理,後臺私信我回復「數據分析」免費領取!
  • python入門教程06-01(python語法入門之字符編碼)
    人在與計算機交流的時候,用的都是人類能讀懂的字符,如中文字符、英文字符、日文字符等毫無疑問,由人類的字符到計算機中的數字,必須經歷一個過程,計算機所識別出來的文字都是二進位的0011等等,所以此次課程講的是字符編碼的介紹和如何深刻認識字符編碼?
  • 純前端表格控制項 SpreadJS V14.0 發布:組件化編輯器+數據透視表
    從該版本開始,SpreadJS推出了數據透視表功能,進一步降低企業數據分析的門檻,提升系統數據處理的能力。此外,SpreadJS 還在 V14.0中發布了組件化的在線表格編輯器,提供了更易嵌入、秒級加載、靈活定製的功能。在線表格編輯器可與SpreadJS 舊版本集成,助力開發者在主流前端 JS 框架中,實現高性能的模板設計、在線編輯、填報和數據綁定等功能。
  • excel函數應用解析:透視表專有函數GETPIVOTDATA
    它就是我們前段時間發布的《受夠加班煎熬,我整理出10條職場人士最常用的透視表技巧!(下篇)》教程中,所提到的透視表的專有函數。GETPIVOTDATA函數的主要功能是返回透視表中的可見數據。需要在「數據透視表工具」欄下的「分析」選項卡下,點擊「選項」,勾選「生成GetPivotData」才能使用GETPIVOTDATA函數。